Skip to content

Straits syntax

Straits introduces the .* operator and use traits statement.

use traits statement

1
use traits * from traitSet;

The use traits statement is used to specify which traits are available. use traits * from traitSet; enables all the traits defined in traitSet. It applies to the current scopes and all subscopes.

.* operator

1
2
obj.*trait
obj.*trait = ...;

The .* operator is used to access a trait of an object. obj.*trait will access the trait named trait on obj. Exactly one trait named trait must be available (thanks to an use traits statement) in the scope where it's used: if none, or multiple different ones are available, an exception will be thrown.

If .* is used to assign a trait, such trait (i.e. symbol property) will be not-enumerable.

.* requires a trait name to be statically used. A symbol variable cannot be used as a trait: it can be accessed using [].

.* won't work on null or undefined, since . operator can't work on them either. @straits/utils offers some utility function to work with them: an asFreeFunction() function to obtain a free function wrapping a trait. Such free function could have a default behavior for objects that don't implement the trait, which can be installed with implDefault().

@straits/babel

@straits/babel can be used to transpile the traits syntax into standard JavaScript.

Proposed enhancements

Use specific traits

The use traits statement could support, besides *, a list of trait names:

1
2
use traits x, y from traitSet1;
use traits z, * from traitSet2;

This would cause looking for the explicitly listed traits in specific trait sets with higher priority: if different traits with the same name were enabled by some use traits * statements, those would be ignored and no error would be thrown.

@straits/babel doesn't support such syntax yet.

.* for default implementations

It might be possible to have .* automatically calling the default implementation of a trait (defined with implDefault from @straits/utils) in case one were available.

That's not the current behavior.