923 lines
24 KiB
Plaintext
923 lines
24 KiB
Plaintext
=== tests/cases/conformance/types/uniqueSymbol/uniqueSymbols.ts ===
|
|
// declarations with call initializer
|
|
const constCall = Symbol();
|
|
>constCall : unique symbol
|
|
>Symbol() : unique symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
let letCall = Symbol();
|
|
>letCall : symbol
|
|
>Symbol() : symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
var varCall = Symbol();
|
|
>varCall : symbol
|
|
>Symbol() : symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
// ambient declaration with type
|
|
declare const constType: unique symbol;
|
|
>constType : unique symbol
|
|
|
|
// declaration with type and call initializer
|
|
const constTypeAndCall: unique symbol = Symbol();
|
|
>constTypeAndCall : unique symbol
|
|
>Symbol() : unique symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
// declaration from initializer
|
|
const constInitToConstCall = constCall;
|
|
>constInitToConstCall : symbol
|
|
>constCall : unique symbol
|
|
|
|
const constInitToLetCall = letCall;
|
|
>constInitToLetCall : symbol
|
|
>letCall : symbol
|
|
|
|
const constInitToVarCall = varCall;
|
|
>constInitToVarCall : symbol
|
|
>varCall : symbol
|
|
|
|
const constInitToConstDeclAmbient = constType;
|
|
>constInitToConstDeclAmbient : symbol
|
|
>constType : unique symbol
|
|
|
|
let letInitToConstCall = constCall;
|
|
>letInitToConstCall : symbol
|
|
>constCall : unique symbol
|
|
|
|
let letInitToLetCall = letCall;
|
|
>letInitToLetCall : symbol
|
|
>letCall : symbol
|
|
|
|
let letInitToVarCall = varCall;
|
|
>letInitToVarCall : symbol
|
|
>varCall : symbol
|
|
|
|
let letInitToConstDeclAmbient = constType;
|
|
>letInitToConstDeclAmbient : symbol
|
|
>constType : unique symbol
|
|
|
|
var varInitToConstCall = constCall;
|
|
>varInitToConstCall : symbol
|
|
>constCall : unique symbol
|
|
|
|
var varInitToLetCall = letCall;
|
|
>varInitToLetCall : symbol
|
|
>letCall : symbol
|
|
|
|
var varInitToVarCall = varCall;
|
|
>varInitToVarCall : symbol
|
|
>varCall : symbol
|
|
|
|
var varInitToConstDeclAmbient = constType;
|
|
>varInitToConstDeclAmbient : symbol
|
|
>constType : unique symbol
|
|
|
|
// declaration from initializer with type query
|
|
const constInitToConstCallWithTypeQuery: typeof constCall = constCall;
|
|
>constInitToConstCallWithTypeQuery : unique symbol
|
|
>constCall : unique symbol
|
|
>constCall : unique symbol
|
|
|
|
const constInitToConstDeclAmbientWithTypeQuery: typeof constType = constType;
|
|
>constInitToConstDeclAmbientWithTypeQuery : unique symbol
|
|
>constType : unique symbol
|
|
>constType : unique symbol
|
|
|
|
// assignment from any
|
|
// https://github.com/Microsoft/TypeScript/issues/29108
|
|
const fromAny: unique symbol = {} as any;
|
|
>fromAny : unique symbol
|
|
>{} as any : any
|
|
>{} : {}
|
|
|
|
// function return inference
|
|
function funcReturnConstCall() { return constCall; }
|
|
>funcReturnConstCall : () => symbol
|
|
>constCall : unique symbol
|
|
|
|
function funcReturnLetCall() { return letCall; }
|
|
>funcReturnLetCall : () => symbol
|
|
>letCall : symbol
|
|
|
|
function funcReturnVarCall() { return varCall; }
|
|
>funcReturnVarCall : () => symbol
|
|
>varCall : symbol
|
|
|
|
// function return value with type query
|
|
function funcReturnConstCallWithTypeQuery(): typeof constCall { return constCall; }
|
|
>funcReturnConstCallWithTypeQuery : () => typeof constCall
|
|
>constCall : unique symbol
|
|
>constCall : unique symbol
|
|
|
|
// generator function yield inference
|
|
function* genFuncYieldConstCall() { yield constCall; }
|
|
>genFuncYieldConstCall : () => Generator<symbol, void, unknown>
|
|
>yield constCall : any
|
|
>constCall : unique symbol
|
|
|
|
function* genFuncYieldLetCall() { yield letCall; }
|
|
>genFuncYieldLetCall : () => Generator<symbol, void, unknown>
|
|
>yield letCall : any
|
|
>letCall : symbol
|
|
|
|
function* genFuncYieldVarCall() { yield varCall; }
|
|
>genFuncYieldVarCall : () => Generator<symbol, void, unknown>
|
|
>yield varCall : any
|
|
>varCall : symbol
|
|
|
|
// generator function yield with return type query
|
|
function* genFuncYieldConstCallWithTypeQuery(): IterableIterator<typeof constCall> { yield constCall; }
|
|
>genFuncYieldConstCallWithTypeQuery : () => IterableIterator<typeof constCall>
|
|
>constCall : unique symbol
|
|
>yield constCall : undefined
|
|
>constCall : unique symbol
|
|
|
|
// async function return inference
|
|
async function asyncFuncReturnConstCall() { return constCall; }
|
|
>asyncFuncReturnConstCall : () => Promise<symbol>
|
|
>constCall : unique symbol
|
|
|
|
async function asyncFuncReturnLetCall() { return letCall; }
|
|
>asyncFuncReturnLetCall : () => Promise<symbol>
|
|
>letCall : symbol
|
|
|
|
async function asyncFuncReturnVarCall() { return varCall; }
|
|
>asyncFuncReturnVarCall : () => Promise<symbol>
|
|
>varCall : symbol
|
|
|
|
// async generator function yield inference
|
|
async function* asyncGenFuncYieldConstCall() { yield constCall; }
|
|
>asyncGenFuncYieldConstCall : () => AsyncGenerator<symbol, void, unknown>
|
|
>yield constCall : any
|
|
>constCall : unique symbol
|
|
|
|
async function* asyncGenFuncYieldLetCall() { yield letCall; }
|
|
>asyncGenFuncYieldLetCall : () => AsyncGenerator<symbol, void, unknown>
|
|
>yield letCall : any
|
|
>letCall : symbol
|
|
|
|
async function* asyncGenFuncYieldVarCall() { yield varCall; }
|
|
>asyncGenFuncYieldVarCall : () => AsyncGenerator<symbol, void, unknown>
|
|
>yield varCall : any
|
|
>varCall : symbol
|
|
|
|
// classes
|
|
class C {
|
|
>C : C
|
|
|
|
static readonly readonlyStaticCall = Symbol();
|
|
>readonlyStaticCall : unique symbol
|
|
>Symbol() : unique symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
static readonly readonlyStaticType: unique symbol;
|
|
>readonlyStaticType : unique symbol
|
|
|
|
static readonly readonlyStaticTypeAndCall: unique symbol = Symbol();
|
|
>readonlyStaticTypeAndCall : unique symbol
|
|
>Symbol() : unique symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
static readwriteStaticCall = Symbol();
|
|
>readwriteStaticCall : symbol
|
|
>Symbol() : symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
readonly readonlyCall = Symbol();
|
|
>readonlyCall : symbol
|
|
>Symbol() : symbol
|
|
>Symbol : SymbolConstructor
|
|
|
|
readwriteCall = Symbol();
|
|
>readwriteCall : symbol
|
|
>Symbol() : symbol
|
|
>Symbol : SymbolConstructor
|
|
}
|
|
declare const c: C;
|
|
>c : C
|
|
|
|
const constInitToCReadonlyStaticCall = C.readonlyStaticCall;
|
|
>constInitToCReadonlyStaticCall : symbol
|
|
>C.readonlyStaticCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticCall : unique symbol
|
|
|
|
const constInitToCReadonlyStaticType = C.readonlyStaticType;
|
|
>constInitToCReadonlyStaticType : symbol
|
|
>C.readonlyStaticType : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticType : unique symbol
|
|
|
|
const constInitToCReadonlyStaticTypeAndCall = C.readonlyStaticTypeAndCall;
|
|
>constInitToCReadonlyStaticTypeAndCall : symbol
|
|
>C.readonlyStaticTypeAndCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticTypeAndCall : unique symbol
|
|
|
|
const constInitToCReadwriteStaticCall = C.readwriteStaticCall;
|
|
>constInitToCReadwriteStaticCall : symbol
|
|
>C.readwriteStaticCall : symbol
|
|
>C : typeof C
|
|
>readwriteStaticCall : symbol
|
|
|
|
const constInitToCReadonlyStaticCallWithTypeQuery: typeof C.readonlyStaticCall = C.readonlyStaticCall;
|
|
>constInitToCReadonlyStaticCallWithTypeQuery : unique symbol
|
|
>C.readonlyStaticCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticCall : unique symbol
|
|
>C.readonlyStaticCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticCall : unique symbol
|
|
|
|
const constInitToCReadonlyStaticTypeWithTypeQuery: typeof C.readonlyStaticType = C.readonlyStaticType;
|
|
>constInitToCReadonlyStaticTypeWithTypeQuery : unique symbol
|
|
>C.readonlyStaticType : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticType : unique symbol
|
|
>C.readonlyStaticType : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticType : unique symbol
|
|
|
|
const constInitToCReadonlyStaticTypeAndCallWithTypeQuery: typeof C.readonlyStaticTypeAndCall = C.readonlyStaticTypeAndCall;
|
|
>constInitToCReadonlyStaticTypeAndCallWithTypeQuery : unique symbol
|
|
>C.readonlyStaticTypeAndCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticTypeAndCall : unique symbol
|
|
>C.readonlyStaticTypeAndCall : unique symbol
|
|
>C : typeof C
|
|
>readonlyStaticTypeAndCall : unique symbol
|
|
|
|
const constInitToCReadwriteStaticCallWithTypeQuery: typeof C.readwriteStaticCall = C.readwriteStaticCall;
|
|
>constInitToCReadwriteStaticCallWithTypeQuery : symbol
|
|
>C.readwriteStaticCall : symbol
|
|
>C : typeof C
|
|
>readwriteStaticCall : symbol
|
|
>C.readwriteStaticCall : symbol
|
|
>C : typeof C
|
|
>readwriteStaticCall : symbol
|
|
|
|
const constInitToCReadonlyCall = c.readonlyCall;
|
|
>constInitToCReadonlyCall : symbol
|
|
>c.readonlyCall : symbol
|
|
>c : C
|
|
>readonlyCall : symbol
|
|
|
|
const constInitToCReadwriteCall = c.readwriteCall;
|
|
>constInitToCReadwriteCall : symbol
|
|
>c.readwriteCall : symbol
|
|
>c : C
|
|
>readwriteCall : symbol
|
|
|
|
const constInitToCReadonlyCallWithTypeQuery: typeof c.readonlyCall = c.readonlyCall;
|
|
>constInitToCReadonlyCallWithTypeQuery : symbol
|
|
>c.readonlyCall : symbol
|
|
>c : C
|
|
>readonlyCall : symbol
|
|
>c.readonlyCall : symbol
|
|
>c : C
|
|
>readonlyCall : symbol
|
|
|
|
const constInitToCReadwriteCallWithTypeQuery: typeof c.readwriteCall = c.readwriteCall;
|
|
>constInitToCReadwriteCallWithTypeQuery : symbol
|
|
>c.readwriteCall : symbol
|
|
>c : C
|
|
>readwriteCall : symbol
|
|
>c.readwriteCall : symbol
|
|
>c : C
|
|
>readwriteCall : symbol
|
|
|
|
const constInitToCReadonlyCallWithIndexedAccess: C["readonlyCall"] = c.readonlyCall;
|
|
>constInitToCReadonlyCallWithIndexedAccess : symbol
|
|
>c.readonlyCall : symbol
|
|
>c : C
|
|
>readonlyCall : symbol
|
|
|
|
const constInitToCReadwriteCallWithIndexedAccess: C["readwriteCall"] = c.readwriteCall;
|
|
>constInitToCReadwriteCallWithIndexedAccess : symbol
|
|
>c.readwriteCall : symbol
|
|
>c : C
|
|
>readwriteCall : symbol
|
|
|
|
// interfaces
|
|
interface I {
|
|
readonly readonlyType: unique symbol;
|
|
>readonlyType : unique symbol
|
|
}
|
|
declare const i: I;
|
|
>i : I
|
|
|
|
const constInitToIReadonlyType = i.readonlyType;
|
|
>constInitToIReadonlyType : symbol
|
|
>i.readonlyType : unique symbol
|
|
>i : I
|
|
>readonlyType : unique symbol
|
|
|
|
const constInitToIReadonlyTypeWithTypeQuery: typeof i.readonlyType = i.readonlyType;
|
|
>constInitToIReadonlyTypeWithTypeQuery : unique symbol
|
|
>i.readonlyType : unique symbol
|
|
>i : I
|
|
>readonlyType : unique symbol
|
|
>i.readonlyType : unique symbol
|
|
>i : I
|
|
>readonlyType : unique symbol
|
|
|
|
const constInitToIReadonlyTypeWithIndexedAccess: I["readonlyType"] = i.readonlyType;
|
|
>constInitToIReadonlyTypeWithIndexedAccess : unique symbol
|
|
>i.readonlyType : unique symbol
|
|
>i : I
|
|
>readonlyType : unique symbol
|
|
|
|
// type literals
|
|
type L = {
|
|
>L : L
|
|
|
|
readonly readonlyType: unique symbol;
|
|
>readonlyType : unique symbol
|
|
|
|
nested: {
|
|
>nested : { readonly readonlyNestedType: unique symbol; }
|
|
|
|
readonly readonlyNestedType: unique symbol;
|
|
>readonlyNestedType : unique symbol
|
|
}
|
|
};
|
|
declare const l: L;
|
|
>l : L
|
|
|
|
const constInitToLReadonlyType = l.readonlyType;
|
|
>constInitToLReadonlyType : symbol
|
|
>l.readonlyType : unique symbol
|
|
>l : L
|
|
>readonlyType : unique symbol
|
|
|
|
const constInitToLReadonlyNestedType = l.nested.readonlyNestedType;
|
|
>constInitToLReadonlyNestedType : symbol
|
|
>l.nested.readonlyNestedType : unique symbol
|
|
>l.nested : { readonly readonlyNestedType: unique symbol; }
|
|
>l : L
|
|
>nested : { readonly readonlyNestedType: unique symbol; }
|
|
>readonlyNestedType : unique symbol
|
|
|
|
const constInitToLReadonlyTypeWithTypeQuery: typeof l.readonlyType = l.readonlyType;
|
|
>constInitToLReadonlyTypeWithTypeQuery : unique symbol
|
|
>l.readonlyType : unique symbol
|
|
>l : L
|
|
>readonlyType : unique symbol
|
|
>l.readonlyType : unique symbol
|
|
>l : L
|
|
>readonlyType : unique symbol
|
|
|
|
const constInitToLReadonlyNestedTypeWithTypeQuery: typeof l.nested.readonlyNestedType = l.nested.readonlyNestedType;
|
|
>constInitToLReadonlyNestedTypeWithTypeQuery : unique symbol
|
|
>l.nested.readonlyNestedType : unique symbol
|
|
>l.nested : { readonly readonlyNestedType: unique symbol; }
|
|
>l : L
|
|
>nested : { readonly readonlyNestedType: unique symbol; }
|
|
>readonlyNestedType : unique symbol
|
|
>l.nested.readonlyNestedType : unique symbol
|
|
>l.nested : { readonly readonlyNestedType: unique symbol; }
|
|
>l : L
|
|
>nested : { readonly readonlyNestedType: unique symbol; }
|
|
>readonlyNestedType : unique symbol
|
|
|
|
const constInitToLReadonlyTypeWithIndexedAccess: L["readonlyType"] = l.readonlyType;
|
|
>constInitToLReadonlyTypeWithIndexedAccess : unique symbol
|
|
>l.readonlyType : unique symbol
|
|
>l : L
|
|
>readonlyType : unique symbol
|
|
|
|
const constInitToLReadonlyNestedTypeWithIndexedAccess: L["nested"]["readonlyNestedType"] = l.nested.readonlyNestedType;
|
|
>constInitToLReadonlyNestedTypeWithIndexedAccess : unique symbol
|
|
>l.nested.readonlyNestedType : unique symbol
|
|
>l.nested : { readonly readonlyNestedType: unique symbol; }
|
|
>l : L
|
|
>nested : { readonly readonlyNestedType: unique symbol; }
|
|
>readonlyNestedType : unique symbol
|
|
|
|
// type argument inference
|
|
const promiseForConstCall = Promise.resolve(constCall);
|
|
>promiseForConstCall : Promise<unique symbol>
|
|
>Promise.resolve(constCall) : Promise<unique symbol>
|
|
>Promise.resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
|
|
>Promise : PromiseConstructor
|
|
>resolve : { (): Promise<void>; <T>(value: T | PromiseLike<T>): Promise<T>; }
|
|
>constCall : unique symbol
|
|
|
|
const arrayOfConstCall = [constCall];
|
|
>arrayOfConstCall : symbol[]
|
|
>[constCall] : symbol[]
|
|
>constCall : unique symbol
|
|
|
|
// unique symbol widening in expressions
|
|
declare const s: unique symbol;
|
|
>s : unique symbol
|
|
|
|
declare namespace N { const s: unique symbol; }
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
declare const o: { [s]: "a", [N.s]: "b" };
|
|
>o : { [s]: "a"; [N.s]: "b"; }
|
|
>[s] : "a"
|
|
>s : unique symbol
|
|
>[N.s] : "b"
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
declare function f<T>(x: T): T;
|
|
>f : <T>(x: T) => T
|
|
>x : T
|
|
|
|
declare function g(x: typeof s): void;
|
|
>g : { (x: typeof s): void; (x: unique symbol): void; }
|
|
>x : unique symbol
|
|
>s : unique symbol
|
|
|
|
declare function g(x: typeof N.s): void;
|
|
>g : { (x: unique symbol): void; (x: typeof N.s): void; }
|
|
>x : unique symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
// widening positions
|
|
|
|
// argument inference
|
|
f(s);
|
|
>f(s) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>s : unique symbol
|
|
|
|
f(N.s);
|
|
>f(N.s) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
f(N["s"]);
|
|
>f(N["s"]) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
// array literal elements
|
|
[s];
|
|
>[s] : symbol[]
|
|
>s : unique symbol
|
|
|
|
[N.s];
|
|
>[N.s] : symbol[]
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
[N["s"]];
|
|
>[N["s"]] : symbol[]
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
// property assignments/methods
|
|
const o2 = {
|
|
>o2 : { a: symbol; b: symbol; c: symbol; method1(): symbol; method2(): Promise<symbol>; method3(): AsyncGenerator<symbol, void, unknown>; method4(): Generator<symbol, void, unknown>; method5(p?: symbol): symbol; }
|
|
>{ a: s, b: N.s, c: N["s"], method1() { return s; }, async method2() { return s; }, async * method3() { yield s; }, * method4() { yield s; }, method5(p = s) { return p; },} : { a: symbol; b: symbol; c: symbol; method1(): symbol; method2(): Promise<symbol>; method3(): AsyncGenerator<symbol, void, unknown>; method4(): Generator<symbol, void, unknown>; method5(p?: symbol): symbol; }
|
|
|
|
a: s,
|
|
>a : symbol
|
|
>s : unique symbol
|
|
|
|
b: N.s,
|
|
>b : symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
c: N["s"],
|
|
>c : symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
method1() { return s; },
|
|
>method1 : () => symbol
|
|
>s : unique symbol
|
|
|
|
async method2() { return s; },
|
|
>method2 : () => Promise<symbol>
|
|
>s : unique symbol
|
|
|
|
async * method3() { yield s; },
|
|
>method3 : () => AsyncGenerator<symbol, void, unknown>
|
|
>yield s : any
|
|
>s : unique symbol
|
|
|
|
* method4() { yield s; },
|
|
>method4 : () => Generator<symbol, void, unknown>
|
|
>yield s : any
|
|
>s : unique symbol
|
|
|
|
method5(p = s) { return p; },
|
|
>method5 : (p?: symbol) => symbol
|
|
>p : symbol
|
|
>s : unique symbol
|
|
>p : symbol
|
|
|
|
};
|
|
|
|
// property initializers
|
|
class C0 {
|
|
>C0 : C0
|
|
|
|
static readonly a = s;
|
|
>a : symbol
|
|
>s : unique symbol
|
|
|
|
static readonly b = N.s;
|
|
>b : symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
static readonly c = N["s"];
|
|
>c : symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
static d = s;
|
|
>d : symbol
|
|
>s : unique symbol
|
|
|
|
static e = N.s;
|
|
>e : symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
static f = N["s"];
|
|
>f : symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
readonly a = s;
|
|
>a : symbol
|
|
>s : unique symbol
|
|
|
|
readonly b = N.s;
|
|
>b : symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
readonly c = N["s"];
|
|
>c : symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
d = s;
|
|
>d : symbol
|
|
>s : unique symbol
|
|
|
|
e = N.s;
|
|
>e : symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
f = N["s"];
|
|
>f : symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
method1() { return s; }
|
|
>method1 : () => symbol
|
|
>s : unique symbol
|
|
|
|
async method2() { return s; }
|
|
>method2 : () => Promise<symbol>
|
|
>s : unique symbol
|
|
|
|
async * method3() { yield s; }
|
|
>method3 : () => AsyncGenerator<symbol, void, unknown>
|
|
>yield s : any
|
|
>s : unique symbol
|
|
|
|
* method4() { yield s; }
|
|
>method4 : () => Generator<symbol, void, unknown>
|
|
>yield s : any
|
|
>s : unique symbol
|
|
|
|
method5(p = s) { return p; }
|
|
>method5 : (p?: symbol) => symbol
|
|
>p : symbol
|
|
>s : unique symbol
|
|
>p : symbol
|
|
}
|
|
|
|
// non-widening positions
|
|
|
|
// element access
|
|
o[s];
|
|
>o[s] : "a"
|
|
>o : { [s]: "a"; [N.s]: "b"; }
|
|
>s : unique symbol
|
|
|
|
o[N.s];
|
|
>o[N.s] : "b"
|
|
>o : { [s]: "a"; [N.s]: "b"; }
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
o[N["s"]];
|
|
>o[N["s"]] : "b"
|
|
>o : { [s]: "a"; [N.s]: "b"; }
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
// arguments (no-inference)
|
|
f<typeof s>(s);
|
|
>f<typeof s>(s) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>s : unique symbol
|
|
>s : unique symbol
|
|
|
|
f<typeof N.s>(N.s);
|
|
>f<typeof N.s>(N.s) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
f<typeof N.s>(N["s"]);
|
|
>f<typeof N.s>(N["s"]) : unique symbol
|
|
>f : <T>(x: T) => T
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
g(s);
|
|
>g(s) : void
|
|
>g : { (x: unique symbol): void; (x: unique symbol): void; }
|
|
>s : unique symbol
|
|
|
|
g(N.s);
|
|
>g(N.s) : void
|
|
>g : { (x: unique symbol): void; (x: unique symbol): void; }
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
g(N["s"]);
|
|
>g(N["s"]) : void
|
|
>g : { (x: unique symbol): void; (x: unique symbol): void; }
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
|
|
// falsy expressions
|
|
s || "";
|
|
>s || "" : "" | unique symbol
|
|
>s : unique symbol
|
|
>"" : ""
|
|
|
|
N.s || "";
|
|
>N.s || "" : "" | unique symbol
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
>"" : ""
|
|
|
|
N["s"] || "";
|
|
>N["s"] || "" : "" | unique symbol
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
>"" : ""
|
|
|
|
// conditionals
|
|
Math.random() * 2 ? s : "a";
|
|
>Math.random() * 2 ? s : "a" : unique symbol | "a"
|
|
>Math.random() * 2 : number
|
|
>Math.random() : number
|
|
>Math.random : () => number
|
|
>Math : Math
|
|
>random : () => number
|
|
>2 : 2
|
|
>s : unique symbol
|
|
>"a" : "a"
|
|
|
|
Math.random() * 2 ? N.s : "a";
|
|
>Math.random() * 2 ? N.s : "a" : unique symbol | "a"
|
|
>Math.random() * 2 : number
|
|
>Math.random() : number
|
|
>Math.random : () => number
|
|
>Math : Math
|
|
>random : () => number
|
|
>2 : 2
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
>"a" : "a"
|
|
|
|
Math.random() * 2 ? N["s"] : "a";
|
|
>Math.random() * 2 ? N["s"] : "a" : unique symbol | "a"
|
|
>Math.random() * 2 : number
|
|
>Math.random() : number
|
|
>Math.random : () => number
|
|
>Math : Math
|
|
>random : () => number
|
|
>2 : 2
|
|
>N["s"] : unique symbol
|
|
>N : typeof N
|
|
>"s" : "s"
|
|
>"a" : "a"
|
|
|
|
// computed property names
|
|
({
|
|
>({ [s]: "a", [N.s]: "b",}) : { [s]: string; [N.s]: string; }
|
|
>{ [s]: "a", [N.s]: "b",} : { [s]: string; [N.s]: string; }
|
|
|
|
[s]: "a",
|
|
>[s] : string
|
|
>s : unique symbol
|
|
>"a" : "a"
|
|
|
|
[N.s]: "b",
|
|
>[N.s] : string
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
>"b" : "b"
|
|
|
|
});
|
|
|
|
class C1 {
|
|
>C1 : C1
|
|
|
|
static [s]: "a";
|
|
>[s] : "a"
|
|
>s : unique symbol
|
|
|
|
static [N.s]: "b";
|
|
>[N.s] : "b"
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
|
|
[s]: "a";
|
|
>[s] : "a"
|
|
>s : unique symbol
|
|
|
|
[N.s]: "b";
|
|
>[N.s] : "b"
|
|
>N.s : unique symbol
|
|
>N : typeof N
|
|
>s : unique symbol
|
|
}
|
|
|
|
// contextual types
|
|
|
|
interface Context {
|
|
method1(): typeof s;
|
|
>method1 : () => typeof s
|
|
>s : unique symbol
|
|
|
|
method2(): Promise<typeof s>;
|
|
>method2 : () => Promise<typeof s>
|
|
>s : unique symbol
|
|
|
|
method3(): AsyncIterableIterator<typeof s>;
|
|
>method3 : () => AsyncIterableIterator<typeof s>
|
|
>s : unique symbol
|
|
|
|
method4(): IterableIterator<typeof s>;
|
|
>method4 : () => IterableIterator<typeof s>
|
|
>s : unique symbol
|
|
|
|
method5(p?: typeof s): typeof s;
|
|
>method5 : (p?: typeof s) => typeof s
|
|
>p : unique symbol
|
|
>s : unique symbol
|
|
>s : unique symbol
|
|
}
|
|
|
|
const o3: Context = {
|
|
>o3 : Context
|
|
>{ method1() { return s; // return type should not widen due to contextual type }, async method2() { return s; // return type should not widen due to contextual type }, async * method3() { yield s; // yield type should not widen due to contextual type }, * method4() { yield s; // yield type should not widen due to contextual type }, method5(p = s) { // parameter should not widen due to contextual type return p; },} : { method1(): unique symbol; method2(): Promise<unique symbol>; method3(): AsyncGenerator<unique symbol, void, undefined>; method4(): Generator<unique symbol, void, undefined>; method5(p?: unique symbol): unique symbol; }
|
|
|
|
method1() {
|
|
>method1 : () => unique symbol
|
|
|
|
return s; // return type should not widen due to contextual type
|
|
>s : unique symbol
|
|
|
|
},
|
|
async method2() {
|
|
>method2 : () => Promise<unique symbol>
|
|
|
|
return s; // return type should not widen due to contextual type
|
|
>s : unique symbol
|
|
|
|
},
|
|
async * method3() {
|
|
>method3 : () => AsyncGenerator<unique symbol, void, undefined>
|
|
|
|
yield s; // yield type should not widen due to contextual type
|
|
>yield s : undefined
|
|
>s : unique symbol
|
|
|
|
},
|
|
* method4() {
|
|
>method4 : () => Generator<unique symbol, void, undefined>
|
|
|
|
yield s; // yield type should not widen due to contextual type
|
|
>yield s : undefined
|
|
>s : unique symbol
|
|
|
|
},
|
|
method5(p = s) { // parameter should not widen due to contextual type
|
|
>method5 : (p?: unique symbol) => unique symbol
|
|
>p : unique symbol
|
|
>s : unique symbol
|
|
|
|
return p;
|
|
>p : unique symbol
|
|
|
|
},
|
|
};
|
|
|
|
// allowed when not emitting declarations
|
|
|
|
const o4 = {
|
|
>o4 : { method1(p: typeof s): typeof s; method2(p: I["readonlyType"]): I["readonlyType"]; }
|
|
>{ method1(p: typeof s): typeof s { return p; }, method2(p: I["readonlyType"]): I["readonlyType"] { return p; }} : { method1(p: typeof s): typeof s; method2(p: I["readonlyType"]): I["readonlyType"]; }
|
|
|
|
method1(p: typeof s): typeof s {
|
|
>method1 : (p: typeof s) => typeof s
|
|
>p : unique symbol
|
|
>s : unique symbol
|
|
>s : unique symbol
|
|
|
|
return p;
|
|
>p : unique symbol
|
|
|
|
},
|
|
method2(p: I["readonlyType"]): I["readonlyType"] {
|
|
>method2 : (p: I["readonlyType"]) => I["readonlyType"]
|
|
>p : unique symbol
|
|
|
|
return p;
|
|
>p : unique symbol
|
|
}
|
|
};
|
|
|
|
const ce0 = class {
|
|
>ce0 : typeof ce0
|
|
>class { method1(p: typeof s): typeof s { return p; } method2(p: I["readonlyType"]): I["readonlyType"] { return p; }} : typeof ce0
|
|
|
|
method1(p: typeof s): typeof s {
|
|
>method1 : (p: typeof s) => typeof s
|
|
>p : unique symbol
|
|
>s : unique symbol
|
|
>s : unique symbol
|
|
|
|
return p;
|
|
>p : unique symbol
|
|
}
|
|
method2(p: I["readonlyType"]): I["readonlyType"] {
|
|
>method2 : (p: I["readonlyType"]) => I["readonlyType"]
|
|
>p : unique symbol
|
|
|
|
return p;
|
|
>p : unique symbol
|
|
}
|
|
};
|
|
|
|
function funcInferredReturnType(obj: { method(p: typeof s): void }) {
|
|
>funcInferredReturnType : (obj: { method(p: typeof s): void; }) => { method(p: typeof s): void; }
|
|
>obj : { method(p: typeof s): void; }
|
|
>method : (p: typeof s) => void
|
|
>p : unique symbol
|
|
>s : unique symbol
|
|
|
|
return obj;
|
|
>obj : { method(p: unique symbol): void; }
|
|
}
|
|
|