mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Support indexing with known symbols
This commit is contained in:
parent
df826de042
commit
d07ed679a0
@ -97,7 +97,7 @@ module ts {
|
||||
if (node.name.kind === SyntaxKind.ComputedPropertyName) {
|
||||
var nameExpression = (<ComputedPropertyName>node.name).expression;
|
||||
Debug.assert(isWellKnownSymbolSyntactically(nameExpression));
|
||||
return "__@" + (<PropertyAccessExpression>nameExpression).name.text;
|
||||
return getPropertyNameForKnownSymbolName((<PropertyAccessExpression>nameExpression).name.text);
|
||||
}
|
||||
return (<Identifier | LiteralExpression>node.name).text;
|
||||
}
|
||||
|
||||
@ -5787,8 +5787,8 @@ module ts {
|
||||
|
||||
// See if we can index as a property.
|
||||
if (node.argumentExpression) {
|
||||
if (node.argumentExpression.kind === SyntaxKind.StringLiteral || node.argumentExpression.kind === SyntaxKind.NumericLiteral) {
|
||||
var name = (<LiteralExpression>node.argumentExpression).text;
|
||||
var name = getPropertyNameForIndexedAccess(node.argumentExpression);
|
||||
if (name !== undefined) {
|
||||
var prop = getPropertyOfType(objectType, name);
|
||||
if (prop) {
|
||||
getNodeLinks(node).resolvedSymbol = prop;
|
||||
@ -5832,6 +5832,36 @@ module ts {
|
||||
return unknownType;
|
||||
}
|
||||
|
||||
/**
|
||||
* If indexArgumentExpression is a string literal or number literal, returns its text.
|
||||
* If indexArgumentExpression is a well known symbol, returns the property name corresponding
|
||||
* to this symbol.
|
||||
* Otherwise, returns undefined.
|
||||
*/
|
||||
function getPropertyNameForIndexedAccess(indexArgumentExpression: Expression) {
|
||||
if (indexArgumentExpression.kind === SyntaxKind.StringLiteral || indexArgumentExpression.kind === SyntaxKind.NumericLiteral) {
|
||||
return (<LiteralExpression>indexArgumentExpression).text;
|
||||
}
|
||||
if (isWellKnownSymbolSyntactically(indexArgumentExpression)) {
|
||||
var leftHandSide = (<PropertyAccessExpression>indexArgumentExpression).expression;
|
||||
Debug.assert((<Identifier>leftHandSide).text === "Symbol");
|
||||
// The name is Symbol.<someName>, so make sure Symbol actually resolves to the
|
||||
// global Symbol object
|
||||
var leftHandSideSymbol = resolveName(indexArgumentExpression, (<Identifier>leftHandSide).text,
|
||||
SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
|
||||
if (leftHandSideSymbol === globalESSymbolConstructorSymbol) {
|
||||
// Make sure the property type is the primitive symbol type
|
||||
var rightHandSideName = (<Identifier>(<PropertyAccessExpression>indexArgumentExpression).name).text;
|
||||
var esSymbolConstructorPropertyType = getTypeOfPropertyOfType(globalESSymbolConstructorType, rightHandSideName);
|
||||
if (esSymbolConstructorPropertyType && esSymbolConstructorPropertyType.flags & TypeFlags.ESSymbol) {
|
||||
return getPropertyNameForKnownSymbolName(rightHandSideName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function resolveUntypedCall(node: CallLikeExpression): Signature {
|
||||
if (node.kind === SyntaxKind.TaggedTemplateExpression) {
|
||||
checkExpression((<TaggedTemplateExpression>node).template);
|
||||
@ -10334,7 +10364,7 @@ module ts {
|
||||
globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
|
||||
globalESSymbolType = getGlobalType("Symbol");
|
||||
globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
|
||||
globalESSymbolConstructorType = getTypeOfGlobalSymbol(globalESSymbolConstructorSymbol, /*arity*/ 0);
|
||||
globalESSymbolConstructorType = getTypeOfSymbol(globalESSymbolConstructorSymbol);
|
||||
}
|
||||
else {
|
||||
globalTemplateStringsArrayType = unknownType;
|
||||
|
||||
@ -852,6 +852,10 @@ module ts {
|
||||
return node.kind === SyntaxKind.PropertyAccessExpression && isESSymbolIdentifier((<PropertyAccessExpression>node).expression);
|
||||
}
|
||||
|
||||
export function getPropertyNameForKnownSymbolName(symbolName: string): string {
|
||||
return "__@" + symbolName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Includes the word "Symbol" with unicode escapes
|
||||
*/
|
||||
|
||||
27
tests/baselines/reference/symbolProperty17.types
Normal file
27
tests/baselines/reference/symbolProperty17.types
Normal file
@ -0,0 +1,27 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty17.ts ===
|
||||
interface I {
|
||||
>I : I
|
||||
|
||||
[Symbol.iterator]: number;
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
[s: symbol]: string;
|
||||
>s : symbol
|
||||
|
||||
"__@iterator": string;
|
||||
}
|
||||
|
||||
var i: I;
|
||||
>i : I
|
||||
>I : I
|
||||
|
||||
var it = i[Symbol.iterator];
|
||||
>it : number
|
||||
>i[Symbol.iterator] : number
|
||||
>i : I
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
47
tests/baselines/reference/symbolProperty18.types
Normal file
47
tests/baselines/reference/symbolProperty18.types
Normal file
@ -0,0 +1,47 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty18.ts ===
|
||||
var i = {
|
||||
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
|
||||
>{ [Symbol.iterator]: 0, [Symbol.toStringTag]() { return "" }, set [Symbol.toPrimitive](p: boolean) { }} : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
|
||||
|
||||
[Symbol.iterator]: 0,
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
[Symbol.toStringTag]() { return "" },
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
|
||||
set [Symbol.toPrimitive](p: boolean) { }
|
||||
>Symbol.toPrimitive : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toPrimitive : symbol
|
||||
>p : boolean
|
||||
}
|
||||
|
||||
var it = i[Symbol.iterator];
|
||||
>it : number
|
||||
>i[Symbol.iterator] : number
|
||||
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
var str = i[Symbol.toStringTag]();
|
||||
>str : string
|
||||
>i[Symbol.toStringTag]() : string
|
||||
>i[Symbol.toStringTag] : () => string
|
||||
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
|
||||
i[Symbol.toPrimitive] = false;
|
||||
>i[Symbol.toPrimitive] = false : boolean
|
||||
>i[Symbol.toPrimitive] : boolean
|
||||
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
|
||||
>Symbol.toPrimitive : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toPrimitive : symbol
|
||||
|
||||
38
tests/baselines/reference/symbolProperty19.types
Normal file
38
tests/baselines/reference/symbolProperty19.types
Normal file
@ -0,0 +1,38 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty19.ts ===
|
||||
var i = {
|
||||
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
|
||||
>{ [Symbol.iterator]: { p: null }, [Symbol.toStringTag]() { return { p: undefined }; }} : { [Symbol.iterator]: { p: null; }; [Symbol.toStringTag](): { p: any; }; }
|
||||
|
||||
[Symbol.iterator]: { p: null },
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>{ p: null } : { p: null; }
|
||||
>p : null
|
||||
|
||||
[Symbol.toStringTag]() { return { p: undefined }; }
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
>{ p: undefined } : { p: undefined; }
|
||||
>p : undefined
|
||||
>undefined : undefined
|
||||
}
|
||||
|
||||
var it = i[Symbol.iterator];
|
||||
>it : { p: any; }
|
||||
>i[Symbol.iterator] : { p: any; }
|
||||
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
var str = i[Symbol.toStringTag]();
|
||||
>str : { p: any; }
|
||||
>i[Symbol.toStringTag]() : { p: any; }
|
||||
>i[Symbol.toStringTag] : () => { p: any; }
|
||||
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
|
||||
34
tests/baselines/reference/symbolProperty28.types
Normal file
34
tests/baselines/reference/symbolProperty28.types
Normal file
@ -0,0 +1,34 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty28.ts ===
|
||||
class C1 {
|
||||
>C1 : C1
|
||||
|
||||
[Symbol.toStringTag]() {
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
|
||||
return { x: "" };
|
||||
>{ x: "" } : { x: string; }
|
||||
>x : string
|
||||
}
|
||||
}
|
||||
|
||||
class C2 extends C1 { }
|
||||
>C2 : C2
|
||||
>C1 : C1
|
||||
|
||||
var c: C2;
|
||||
>c : C2
|
||||
>C2 : C2
|
||||
|
||||
var obj = c[Symbol.toStringTag]().x;
|
||||
>obj : string
|
||||
>c[Symbol.toStringTag]().x : string
|
||||
>c[Symbol.toStringTag]() : { x: string; }
|
||||
>c[Symbol.toStringTag] : () => { x: string; }
|
||||
>c : C2
|
||||
>Symbol.toStringTag : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>toStringTag : symbol
|
||||
>x : string
|
||||
|
||||
48
tests/baselines/reference/symbolProperty40.types
Normal file
48
tests/baselines/reference/symbolProperty40.types
Normal file
@ -0,0 +1,48 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty40.ts ===
|
||||
class C {
|
||||
>C : C
|
||||
|
||||
[Symbol.iterator](x: string): string;
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : string
|
||||
|
||||
[Symbol.iterator](x: number): number;
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : number
|
||||
|
||||
[Symbol.iterator](x: any) {
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : any
|
||||
|
||||
return undefined;
|
||||
>undefined : undefined
|
||||
}
|
||||
}
|
||||
|
||||
var c = new C;
|
||||
>c : C
|
||||
>new C : C
|
||||
>C : typeof C
|
||||
|
||||
c[Symbol.iterator]("");
|
||||
>c[Symbol.iterator]("") : string
|
||||
>c[Symbol.iterator] : { (x: string): string; (x: number): number; }
|
||||
>c : C
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
c[Symbol.iterator](0);
|
||||
>c[Symbol.iterator](0) : number
|
||||
>c[Symbol.iterator] : { (x: string): string; (x: number): number; }
|
||||
>c : C
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
51
tests/baselines/reference/symbolProperty41.types
Normal file
51
tests/baselines/reference/symbolProperty41.types
Normal file
@ -0,0 +1,51 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty41.ts ===
|
||||
class C {
|
||||
>C : C
|
||||
|
||||
[Symbol.iterator](x: string): { x: string };
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : string
|
||||
>x : string
|
||||
|
||||
[Symbol.iterator](x: "hello"): { x: string; hello: string };
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : "hello"
|
||||
>x : string
|
||||
>hello : string
|
||||
|
||||
[Symbol.iterator](x: any) {
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
>x : any
|
||||
|
||||
return undefined;
|
||||
>undefined : undefined
|
||||
}
|
||||
}
|
||||
|
||||
var c = new C;
|
||||
>c : C
|
||||
>new C : C
|
||||
>C : typeof C
|
||||
|
||||
c[Symbol.iterator]("");
|
||||
>c[Symbol.iterator]("") : { x: string; }
|
||||
>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; }
|
||||
>c : C
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
c[Symbol.iterator]("hello");
|
||||
>c[Symbol.iterator]("hello") : { x: string; hello: string; }
|
||||
>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; }
|
||||
>c : C
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
17
tests/baselines/reference/symbolProperty46.errors.txt
Normal file
17
tests/baselines/reference/symbolProperty46.errors.txt
Normal file
@ -0,0 +1,17 @@
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty46.ts(10,1): error TS2322: Type 'number' is not assignable to type 'string'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty46.ts (1 errors) ====
|
||||
class C {
|
||||
get [Symbol.hasInstance]() {
|
||||
return "";
|
||||
}
|
||||
// Should take a string
|
||||
set [Symbol.hasInstance](x) {
|
||||
}
|
||||
}
|
||||
|
||||
(new C)[Symbol.hasInstance] = 0;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type 'number' is not assignable to type 'string'.
|
||||
(new C)[Symbol.hasInstance] = "";
|
||||
@ -1,7 +1,8 @@
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty47.ts(11,1): error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (1 errors) ====
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (2 errors) ====
|
||||
class C {
|
||||
get [Symbol.hasInstance]() {
|
||||
return "";
|
||||
@ -14,4 +15,6 @@ tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Typ
|
||||
}
|
||||
|
||||
(new C)[Symbol.hasInstance] = 0;
|
||||
(new C)[Symbol.hasInstance] = "";
|
||||
(new C)[Symbol.hasInstance] = "";
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
@ -1,9 +1,10 @@
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(2,13): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'.
|
||||
Property '[Symbol.nonsense]' is missing in type '{}'.
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(7,12): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (2 errors) ====
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (3 errors) ====
|
||||
var obj = {
|
||||
[Symbol.nonsense]: 0
|
||||
~~~~~~~~
|
||||
@ -13,4 +14,8 @@ tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type
|
||||
obj = {};
|
||||
~~~
|
||||
!!! error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'.
|
||||
!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'.
|
||||
!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'.
|
||||
|
||||
obj[Symbol.nonsense];
|
||||
~~~~~~~~
|
||||
!!! error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.
|
||||
@ -3,10 +3,13 @@ var obj = {
|
||||
[Symbol.nonsense]: 0
|
||||
};
|
||||
|
||||
obj = {};
|
||||
obj = {};
|
||||
|
||||
obj[Symbol.nonsense];
|
||||
|
||||
//// [symbolProperty52.js]
|
||||
var obj = {
|
||||
[Symbol.nonsense]: 0
|
||||
};
|
||||
obj = {};
|
||||
obj[Symbol.nonsense];
|
||||
|
||||
@ -1,9 +1,14 @@
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
|
||||
tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (1 errors) ====
|
||||
==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (2 errors) ====
|
||||
var obj = {
|
||||
[Symbol.for]: 0
|
||||
~~~~~~~~~~~~
|
||||
!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
|
||||
};
|
||||
};
|
||||
|
||||
obj[Symbol.for];
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.
|
||||
@ -1,9 +1,12 @@
|
||||
//// [symbolProperty53.ts]
|
||||
var obj = {
|
||||
[Symbol.for]: 0
|
||||
};
|
||||
};
|
||||
|
||||
obj[Symbol.for];
|
||||
|
||||
//// [symbolProperty53.js]
|
||||
var obj = {
|
||||
[Symbol.for]: 0
|
||||
};
|
||||
obj[Symbol.for];
|
||||
|
||||
23
tests/baselines/reference/symbolProperty55.js
Normal file
23
tests/baselines/reference/symbolProperty55.js
Normal file
@ -0,0 +1,23 @@
|
||||
//// [symbolProperty55.ts]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
module M {
|
||||
var Symbol: SymbolConstructor;
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol.iterator];
|
||||
}
|
||||
|
||||
//// [symbolProperty55.js]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
var M;
|
||||
(function (M) {
|
||||
var Symbol;
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol.iterator];
|
||||
})(M || (M = {}));
|
||||
28
tests/baselines/reference/symbolProperty55.types
Normal file
28
tests/baselines/reference/symbolProperty55.types
Normal file
@ -0,0 +1,28 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty55.ts ===
|
||||
var obj = {
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
|
||||
|
||||
[Symbol.iterator]: 0
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
};
|
||||
|
||||
module M {
|
||||
>M : typeof M
|
||||
|
||||
var Symbol: SymbolConstructor;
|
||||
>Symbol : SymbolConstructor
|
||||
>SymbolConstructor : SymbolConstructor
|
||||
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol.iterator];
|
||||
>obj[Symbol.iterator] : any
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
}
|
||||
23
tests/baselines/reference/symbolProperty56.js
Normal file
23
tests/baselines/reference/symbolProperty56.js
Normal file
@ -0,0 +1,23 @@
|
||||
//// [symbolProperty56.ts]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
module M {
|
||||
var Symbol: {};
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol["iterator"]];
|
||||
}
|
||||
|
||||
//// [symbolProperty56.js]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
var M;
|
||||
(function (M) {
|
||||
var Symbol;
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol["iterator"]];
|
||||
})(M || (M = {}));
|
||||
26
tests/baselines/reference/symbolProperty56.types
Normal file
26
tests/baselines/reference/symbolProperty56.types
Normal file
@ -0,0 +1,26 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty56.ts ===
|
||||
var obj = {
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
|
||||
|
||||
[Symbol.iterator]: 0
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
};
|
||||
|
||||
module M {
|
||||
>M : typeof M
|
||||
|
||||
var Symbol: {};
|
||||
>Symbol : {}
|
||||
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol["iterator"]];
|
||||
>obj[Symbol["iterator"]] : any
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>Symbol["iterator"] : any
|
||||
>Symbol : {}
|
||||
}
|
||||
14
tests/baselines/reference/symbolProperty57.js
Normal file
14
tests/baselines/reference/symbolProperty57.js
Normal file
@ -0,0 +1,14 @@
|
||||
//// [symbolProperty57.ts]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
// Should give type 'any'.
|
||||
obj[Symbol["nonsense"]];
|
||||
|
||||
//// [symbolProperty57.js]
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
// Should give type 'any'.
|
||||
obj[Symbol["nonsense"]];
|
||||
19
tests/baselines/reference/symbolProperty57.types
Normal file
19
tests/baselines/reference/symbolProperty57.types
Normal file
@ -0,0 +1,19 @@
|
||||
=== tests/cases/conformance/es6/Symbols/symbolProperty57.ts ===
|
||||
var obj = {
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
|
||||
|
||||
[Symbol.iterator]: 0
|
||||
>Symbol.iterator : symbol
|
||||
>Symbol : SymbolConstructor
|
||||
>iterator : symbol
|
||||
|
||||
};
|
||||
|
||||
// Should give type 'any'.
|
||||
obj[Symbol["nonsense"]];
|
||||
>obj[Symbol["nonsense"]] : any
|
||||
>obj : { [Symbol.iterator]: number; }
|
||||
>Symbol["nonsense"] : any
|
||||
>Symbol : SymbolConstructor
|
||||
|
||||
@ -3,4 +3,6 @@ var obj = {
|
||||
[Symbol.nonsense]: 0
|
||||
};
|
||||
|
||||
obj = {};
|
||||
obj = {};
|
||||
|
||||
obj[Symbol.nonsense];
|
||||
@ -1,4 +1,6 @@
|
||||
//@target: ES6
|
||||
var obj = {
|
||||
[Symbol.for]: 0
|
||||
};
|
||||
};
|
||||
|
||||
obj[Symbol.for];
|
||||
11
tests/cases/conformance/es6/Symbols/symbolProperty55.ts
Normal file
11
tests/cases/conformance/es6/Symbols/symbolProperty55.ts
Normal file
@ -0,0 +1,11 @@
|
||||
//@target: ES6
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
module M {
|
||||
var Symbol: SymbolConstructor;
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol.iterator];
|
||||
}
|
||||
11
tests/cases/conformance/es6/Symbols/symbolProperty56.ts
Normal file
11
tests/cases/conformance/es6/Symbols/symbolProperty56.ts
Normal file
@ -0,0 +1,11 @@
|
||||
//@target: ES6
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
module M {
|
||||
var Symbol: {};
|
||||
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
|
||||
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
|
||||
obj[Symbol["iterator"]];
|
||||
}
|
||||
7
tests/cases/conformance/es6/Symbols/symbolProperty57.ts
Normal file
7
tests/cases/conformance/es6/Symbols/symbolProperty57.ts
Normal file
@ -0,0 +1,7 @@
|
||||
//@target: ES6
|
||||
var obj = {
|
||||
[Symbol.iterator]: 0
|
||||
};
|
||||
|
||||
// Should give type 'any'.
|
||||
obj[Symbol["nonsense"]];
|
||||
Loading…
x
Reference in New Issue
Block a user