Skip to content

Support ES6 built-in symbols - #1978

Merged
Jason Freeman (JsonFreeman) merged 44 commits into
masterfrom
esSymbols
Feb 18, 2015
Merged

Support ES6 built-in symbols#1978
Jason Freeman (JsonFreeman) merged 44 commits into
masterfrom
esSymbols

Conversation

@JsonFreeman

Copy link
Copy Markdown
Contributor

This change adds type checking support for properties whose names are the built-in ES symbols. It allows you to create objects like:

var obj = {
    [Symbol.toStringTag]() {
        return "";
    }
}

And you get the right type when you index:

obj[Symbol.toStringTag](0); // Error because the method expected no arguments

I've also added a new keyword for the symbol primitive type, as well as type guard support, errors for all the operators ,etc. To see the full design discussion, see #980.

This pull request fixes #1750, and #1863. However, strong type information is only available for the built-in ES6 symbols (properties of the global Symbol object).

This does not cover symbol indexers, which allows an object to act as a map with arbitrary symbol keys.

I also did my best to allow symbol polyfilling to work on the type side, provided that the provider of the polyfill also provide the typings for the global Symbol object.

I recommend going through the pull request commit-by-commit, although some commits were experiments that were largely reverted later on. This is mainly true for the following two commits, so feel free to skip them if you like:

  • Allow Symbol indexer in ES6
  • Create global Symbol type