Guards are now ready for discussion (was: Nov 18 notes)

Brendan Eich brendan at
Sun Nov 21 21:54:33 PST 2010

On Nov 21, 2010, at 7:52 PM, Mark S. Miller wrote:

> On Sun, Nov 21, 2010 at 7:48 PM, Brendan Eich <brendan at> wrote:
>> The reason I chose "::" over ":" is not for a love of "::". Alternative suggestions appreciated! However, I avoided ":" so that we could guard properties within object literals <>. I don't see a way to use ":" for that without confusion. The ES4 solution -- that one can only annotate an object literal as a whole but not its individual properties -- always seemed unpleasant.
> :: is strictly less pleasant, and really kind of "taken" due to the precedents I cited. The "less pleasant" point is the big one IMHO.
> Can we find something better than "::" that doesn't conflict with the ":" in the object literal syntax? As I said, I have no love for "::".

Annotating property names in object initialisers is a relatively infrequent use-case -- a hard case that should not impose double the number of colons on all annotated declarations (formal parameters, let/const/var, function return types).

The ML-ish solution, which is forward compatible, is to parenthesize:

let typedObj = { (prop1:type1): value1, (prop2:type2): value2, ... };

The parentheses hurt too, but only this case. And it still may win to annotate the entire ObjectLiteral sometimes, which would avoid (or move to one common guard-type definition) the property-wise annotation overhead. Comments?


More information about the es-discuss mailing list