From 0823eba8a3257b80df68494ac0d534ac9b6bd16b Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Mon, 11 Sep 2017 10:38:46 -0700 Subject: [PATCH] Add tests --- .../higherOrderMappedIndexLookupInference.js | 43 ++++++++ ...herOrderMappedIndexLookupInference.symbols | 98 +++++++++++++++++ ...igherOrderMappedIndexLookupInference.types | 104 ++++++++++++++++++ .../higherOrderMappedIndexLookupInference.ts | 25 +++++ 4 files changed, 270 insertions(+) create mode 100644 tests/baselines/reference/higherOrderMappedIndexLookupInference.js create mode 100644 tests/baselines/reference/higherOrderMappedIndexLookupInference.symbols create mode 100644 tests/baselines/reference/higherOrderMappedIndexLookupInference.types create mode 100644 tests/cases/compiler/higherOrderMappedIndexLookupInference.ts diff --git a/tests/baselines/reference/higherOrderMappedIndexLookupInference.js b/tests/baselines/reference/higherOrderMappedIndexLookupInference.js new file mode 100644 index 00000000000..e8e09a59713 --- /dev/null +++ b/tests/baselines/reference/higherOrderMappedIndexLookupInference.js @@ -0,0 +1,43 @@ +//// [higherOrderMappedIndexLookupInference.ts] +// @strict + +function f1(a: () => keyof T, b: () => keyof U) { + a = b; + b = a; +} + +function f2(a: () => T[K], b: () => U[L]) { + a = b; + b = a; +} + +function f3(a: () => { [K in keyof T]: T[K] }, b: () => { [K in keyof U]: U[K] }) { + a = b; + b = a; +} + +// Repro from #18338 + +type IdMapped = { [K in keyof T]: T[K] } + +declare const f: () => IdMapped; +declare const g: () => { [K in keyof U]: U[K] }; + +const h: typeof g = f; + + +//// [higherOrderMappedIndexLookupInference.js] +// @strict +function f1(a, b) { + a = b; + b = a; +} +function f2(a, b) { + a = b; + b = a; +} +function f3(a, b) { + a = b; + b = a; +} +var h = f; diff --git a/tests/baselines/reference/higherOrderMappedIndexLookupInference.symbols b/tests/baselines/reference/higherOrderMappedIndexLookupInference.symbols new file mode 100644 index 00000000000..44ecb1e6d02 --- /dev/null +++ b/tests/baselines/reference/higherOrderMappedIndexLookupInference.symbols @@ -0,0 +1,98 @@ +=== tests/cases/compiler/higherOrderMappedIndexLookupInference.ts === +// @strict + +function f1(a: () => keyof T, b: () => keyof U) { +>f1 : Symbol(f1, Decl(higherOrderMappedIndexLookupInference.ts, 0, 0)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 2, 12)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 2, 16)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 2, 16)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 2, 32)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 2, 37)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 2, 37)) + + a = b; +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 2, 12)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 2, 32)) + + b = a; +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 2, 32)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 2, 12)) +} + +function f2(a: () => T[K], b: () => U[L]) { +>f2 : Symbol(f2, Decl(higherOrderMappedIndexLookupInference.ts, 5, 1)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 7, 12)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 7, 16)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 7, 18)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 7, 16)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 7, 16)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 7, 18)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 7, 48)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 7, 53)) +>L : Symbol(L, Decl(higherOrderMappedIndexLookupInference.ts, 7, 55)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 7, 53)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 7, 53)) +>L : Symbol(L, Decl(higherOrderMappedIndexLookupInference.ts, 7, 55)) + + a = b; +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 7, 12)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 7, 48)) + + b = a; +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 7, 48)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 7, 12)) +} + +function f3(a: () => { [K in keyof T]: T[K] }, b: () => { [K in keyof U]: U[K] }) { +>f3 : Symbol(f3, Decl(higherOrderMappedIndexLookupInference.ts, 10, 1)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 12, 12)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 12, 16)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 12, 27)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 12, 16)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 12, 16)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 12, 27)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 12, 49)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 12, 54)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 12, 65)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 12, 54)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 12, 54)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 12, 65)) + + a = b; +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 12, 12)) +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 12, 49)) + + b = a; +>b : Symbol(b, Decl(higherOrderMappedIndexLookupInference.ts, 12, 49)) +>a : Symbol(a, Decl(higherOrderMappedIndexLookupInference.ts, 12, 12)) +} + +// Repro from #18338 + +type IdMapped = { [K in keyof T]: T[K] } +>IdMapped : Symbol(IdMapped, Decl(higherOrderMappedIndexLookupInference.ts, 15, 1)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 19, 14)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 19, 22)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 19, 14)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 19, 14)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 19, 22)) + +declare const f: () => IdMapped; +>f : Symbol(f, Decl(higherOrderMappedIndexLookupInference.ts, 21, 13)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 21, 18)) +>IdMapped : Symbol(IdMapped, Decl(higherOrderMappedIndexLookupInference.ts, 15, 1)) +>T : Symbol(T, Decl(higherOrderMappedIndexLookupInference.ts, 21, 18)) + +declare const g: () => { [K in keyof U]: U[K] }; +>g : Symbol(g, Decl(higherOrderMappedIndexLookupInference.ts, 22, 13)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 22, 18)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 22, 29)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 22, 18)) +>U : Symbol(U, Decl(higherOrderMappedIndexLookupInference.ts, 22, 18)) +>K : Symbol(K, Decl(higherOrderMappedIndexLookupInference.ts, 22, 29)) + +const h: typeof g = f; +>h : Symbol(h, Decl(higherOrderMappedIndexLookupInference.ts, 24, 5)) +>g : Symbol(g, Decl(higherOrderMappedIndexLookupInference.ts, 22, 13)) +>f : Symbol(f, Decl(higherOrderMappedIndexLookupInference.ts, 21, 13)) + diff --git a/tests/baselines/reference/higherOrderMappedIndexLookupInference.types b/tests/baselines/reference/higherOrderMappedIndexLookupInference.types new file mode 100644 index 00000000000..f1c2b0aa17b --- /dev/null +++ b/tests/baselines/reference/higherOrderMappedIndexLookupInference.types @@ -0,0 +1,104 @@ +=== tests/cases/compiler/higherOrderMappedIndexLookupInference.ts === +// @strict + +function f1(a: () => keyof T, b: () => keyof U) { +>f1 : (a: () => keyof T, b: () => keyof U) => void +>a : () => keyof T +>T : T +>T : T +>b : () => keyof U +>U : U +>U : U + + a = b; +>a = b : () => keyof U +>a : () => keyof T +>b : () => keyof U + + b = a; +>b = a : () => keyof T +>b : () => keyof U +>a : () => keyof T +} + +function f2(a: () => T[K], b: () => U[L]) { +>f2 : (a: () => T[K], b: () => U[L]) => void +>a : () => T[K] +>T : T +>K : K +>T : T +>T : T +>K : K +>b : () => U[L] +>U : U +>L : L +>U : U +>U : U +>L : L + + a = b; +>a = b : () => U[L] +>a : () => T[K] +>b : () => U[L] + + b = a; +>b = a : () => T[K] +>b : () => U[L] +>a : () => T[K] +} + +function f3(a: () => { [K in keyof T]: T[K] }, b: () => { [K in keyof U]: U[K] }) { +>f3 : (a: () => { [K in keyof T]: T[K]; }, b: () => { [K in keyof U]: U[K]; }) => void +>a : () => { [K in keyof T]: T[K]; } +>T : T +>K : K +>T : T +>T : T +>K : K +>b : () => { [K in keyof U]: U[K]; } +>U : U +>K : K +>U : U +>U : U +>K : K + + a = b; +>a = b : () => { [K in keyof U]: U[K]; } +>a : () => { [K in keyof T]: T[K]; } +>b : () => { [K in keyof U]: U[K]; } + + b = a; +>b = a : () => { [K in keyof T]: T[K]; } +>b : () => { [K in keyof U]: U[K]; } +>a : () => { [K in keyof T]: T[K]; } +} + +// Repro from #18338 + +type IdMapped = { [K in keyof T]: T[K] } +>IdMapped : IdMapped +>T : T +>K : K +>T : T +>T : T +>K : K + +declare const f: () => IdMapped; +>f : () => IdMapped +>T : T +>IdMapped : IdMapped +>T : T + +declare const g: () => { [K in keyof U]: U[K] }; +>g : () => { [K in keyof U]: U[K]; } +>U : U +>K : K +>U : U +>U : U +>K : K + +const h: typeof g = f; +>h : () => { [K in keyof U]: U[K]; } +>g : () => { [K in keyof U]: U[K]; } +>f : () => IdMapped + diff --git a/tests/cases/compiler/higherOrderMappedIndexLookupInference.ts b/tests/cases/compiler/higherOrderMappedIndexLookupInference.ts new file mode 100644 index 00000000000..96156283915 --- /dev/null +++ b/tests/cases/compiler/higherOrderMappedIndexLookupInference.ts @@ -0,0 +1,25 @@ +// @strict + +function f1(a: () => keyof T, b: () => keyof U) { + a = b; + b = a; +} + +function f2(a: () => T[K], b: () => U[L]) { + a = b; + b = a; +} + +function f3(a: () => { [K in keyof T]: T[K] }, b: () => { [K in keyof U]: U[K] }) { + a = b; + b = a; +} + +// Repro from #18338 + +type IdMapped = { [K in keyof T]: T[K] } + +declare const f: () => IdMapped; +declare const g: () => { [K in keyof U]: U[K] }; + +const h: typeof g = f;