TypeScript/tests/baselines/reference/narrowingOfQualifiedNames.symbols
Zzzen 756392c1f5
support QualifiedName when narrowing inside loops (#43592)
* support QualifiedName when narrowing inside loops

* add test

* narrow more qualified names

* handle `undefined` of `getFlowCacheKey `

* update comments in test
2021-05-21 10:36:54 -07:00

256 lines
12 KiB
Plaintext

=== tests/cases/compiler/narrowingOfQualifiedNames.ts ===
// Repro from #43411
interface IProperties {
>IProperties : Symbol(IProperties, Decl(narrowingOfQualifiedNames.ts, 0, 0))
foo?: {
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
aaa: string
>aaa : Symbol(aaa, Decl(narrowingOfQualifiedNames.ts, 3, 11))
bbb: string
>bbb : Symbol(bbb, Decl(narrowingOfQualifiedNames.ts, 4, 19))
}
}
function init(properties: IProperties) {
>init : Symbol(init, Decl(narrowingOfQualifiedNames.ts, 7, 1))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>IProperties : Symbol(IProperties, Decl(narrowingOfQualifiedNames.ts, 0, 0))
if (properties.foo) {
>properties.foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
type FooOK = typeof properties.foo;
>FooOK : Symbol(FooOK, Decl(narrowingOfQualifiedNames.ts, 10, 25))
>properties.foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
properties.foo; // type is { aaa: string; bbb: string; }
>properties.foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
for (const x of [1, 2, 3]) {
>x : Symbol(x, Decl(narrowingOfQualifiedNames.ts, 13, 18))
properties.foo; // type is { aaa: string; bbb: string; }
>properties.foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
type FooOrUndefined = typeof properties.foo; // type should be { aaa: string; bbb: string; }
>FooOrUndefined : Symbol(FooOrUndefined, Decl(narrowingOfQualifiedNames.ts, 14, 25))
>properties.foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
>properties : Symbol(properties, Decl(narrowingOfQualifiedNames.ts, 9, 14))
>foo : Symbol(IProperties.foo, Decl(narrowingOfQualifiedNames.ts, 2, 23))
}
}
}
interface DeepOptional {
>DeepOptional : Symbol(DeepOptional, Decl(narrowingOfQualifiedNames.ts, 18, 1))
a?: {
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
b?: {
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
c?: string
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
}
}
}
function init2(foo: DeepOptional) {
>init2 : Symbol(init2, Decl(narrowingOfQualifiedNames.ts, 26, 1))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>DeepOptional : Symbol(DeepOptional, Decl(narrowingOfQualifiedNames.ts, 18, 1))
if (foo.a) {
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 29, 16))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 30, 30))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 31, 32))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
for(const _ of [1]) {
>_ : Symbol(_, Decl(narrowingOfQualifiedNames.ts, 34, 17))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 34, 29))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 35, 34))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 36, 36))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
if (foo.a.b) {
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 39, 26))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 40, 38))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 41, 40))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
for(const _ of [1]) {
>_ : Symbol(_, Decl(narrowingOfQualifiedNames.ts, 44, 25))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 44, 37))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 45, 42))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 46, 44))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
if (foo.a.b.c) {
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 49, 36))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 50, 46))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 51, 48))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
for(const _ of [1]) {
>_ : Symbol(_, Decl(narrowingOfQualifiedNames.ts, 54, 33))
type A = typeof foo.a;
>A : Symbol(A, Decl(narrowingOfQualifiedNames.ts, 54, 45))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
type B = typeof foo.a.b;
>B : Symbol(B, Decl(narrowingOfQualifiedNames.ts, 55, 50))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
type C = typeof foo.a.b.c;
>C : Symbol(C, Decl(narrowingOfQualifiedNames.ts, 56, 52))
>foo.a.b.c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
>foo.a.b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>foo.a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>foo : Symbol(foo, Decl(narrowingOfQualifiedNames.ts, 28, 15))
>a : Symbol(DeepOptional.a, Decl(narrowingOfQualifiedNames.ts, 20, 24))
>b : Symbol(b, Decl(narrowingOfQualifiedNames.ts, 21, 9))
>c : Symbol(c, Decl(narrowingOfQualifiedNames.ts, 22, 13))
}
}
}
}
}
}
}