Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support ES6 built-in symbols #1978

Merged
merged 44 commits into from
Feb 18, 2015
Merged

Support ES6 built-in symbols #1978

merged 44 commits into from
Feb 18, 2015

Conversation

JsonFreeman
Copy link
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

// boolean primitive types, return the corresponding object types.Otherwise return the type itself.
// Note that the apparent type of a union type is the union type itself.
// For a type parameter, return the base constraint of the type parameter. For the string, number,
// boolean, and symbol primitive types, return the corresponding object types.Otherwise return the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Space before Otherwise

// Return true if type has the given flags, or is a union type composed of types that all have those flags
// Just like isTypeOfKind below, except that it returns true if *any* constituent
// has this kind.
function hasSomeTypeOfKind(type: Type, kind: TypeFlags): boolean {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

someTypeHasKind

@DanielRosenwasser
Copy link
Member

👍

JsonFreeman added a commit that referenced this pull request Feb 18, 2015
Support ES6 built-in symbols
@JsonFreeman JsonFreeman merged commit aa13a97 into master Feb 18, 2015
@JsonFreeman JsonFreeman deleted the esSymbols branch February 18, 2015 21:19
@Vadorequest
Copy link

👍

@microsoft microsoft locked and limited conversation to collaborators Jun 18, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Symbols should not be allowed as operands of arithmetic operations.
5 participants