From 86704e5bf9af79f8b720a1e80bbd6f526ca4be08 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sat, 6 Oct 2018 17:03:27 -0700 Subject: [PATCH] Accept new baselines --- .../reference/unionsOfTupleTypes1.errors.txt | 81 ++++++ .../reference/unionsOfTupleTypes1.js | 99 +++++++ .../reference/unionsOfTupleTypes1.symbols | 241 ++++++++++++++++ .../reference/unionsOfTupleTypes1.types | 266 ++++++++++++++++++ 4 files changed, 687 insertions(+) create mode 100644 tests/baselines/reference/unionsOfTupleTypes1.errors.txt create mode 100644 tests/baselines/reference/unionsOfTupleTypes1.js create mode 100644 tests/baselines/reference/unionsOfTupleTypes1.symbols create mode 100644 tests/baselines/reference/unionsOfTupleTypes1.types diff --git a/tests/baselines/reference/unionsOfTupleTypes1.errors.txt b/tests/baselines/reference/unionsOfTupleTypes1.errors.txt new file mode 100644 index 00000000000..0f8f8ea786a --- /dev/null +++ b/tests/baselines/reference/unionsOfTupleTypes1.errors.txt @@ -0,0 +1,81 @@ +tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts(27,20): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. +tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts(28,20): error TS2460: Type 'T2' has no property '2'. +tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts(31,16): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. +tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts(32,16): error TS2460: Type 'T2' has no property '2'. +tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts(37,18): error TS2733: Index '2' is out-of-bounds in tuple of length 2. + + +==== tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts (5 errors) ==== + type T1 = [string, number]; + type T2 = [boolean] | [string, number]; + type T3 = [string, ...number[]]; + type T4 = [boolean] | [string, ...number[]]; + + type T10 = T1[0]; // string + type T11 = T1[1]; // number + type T12 = T1[2]; // undefined + type T1N = T1[number]; // string | number + + type T20 = T2[0]; // string | boolean + type T21 = T2[1]; // number | undefined + type T22 = T2[2]; // undefined + type T2N = T2[number]; // string | number | boolean + + type T30 = T3[0]; // string + type T31 = T3[1]; // number + type T32 = T3[2]; // number + type T3N = T3[number]; // string | number + + type T40 = T4[0]; // string | boolean + type T41 = T4[1]; // number | undefined + type T42 = T4[2]; // number | undefined + type T4N = T4[number]; // string | number | boolean + + function f1(t1: T1, t2: T2, t3: T3, t4: T4, x: number) { + let [d10, d11, d12] = t1; // string, number + ~~~ +!!! error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. + let [d20, d21, d22] = t2; // string | boolean, number | undefined + ~~~ +!!! error TS2460: Type 'T2' has no property '2'. + let [d30, d31, d32] = t3; // string, number, number + let [d40, d41, d42] = t4; // string | boolean, number | undefined, number | undefined + [d10, d11, d12] = t1; + ~~~ +!!! error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. + [d20, d21, d22] = t2; + ~~~ +!!! error TS2460: Type 'T2' has no property '2'. + [d30, d31, d32] = t3; + [d40, d41, d42] = t4; + let t10 = t1[0]; // string + let t11 = t1[1]; // number + let t12 = t1[2]; // undefined + ~ +!!! error TS2733: Index '2' is out-of-bounds in tuple of length 2. + let t1x = t1[x]; // string | number + let t20 = t2[0]; // string | boolean + let t21 = t2[1]; // number | undefined + let t22 = t2[2]; // undefined + let t2x = t2[x]; // string | number | boolean + let t30 = t3[0]; // string + let t31 = t3[1]; // number + let t32 = t3[2]; // number + let t3x = t3[x]; // string | number + let t40 = t4[0]; // string | boolean + let t41 = t4[1]; // number | undefined + let t42 = t4[2]; // number | undefined + let t4x = t4[x]; // string | number | boolean + t1[1] = 42; + t2[1] = 42; + t3[1] = 42; + t4[1] = 42; + } + + // Repro from #27543 + + type Unioned = [string] | [string, number]; + const ex: Unioned = ["hi"] as Unioned; + + const [x, y] = ex; + \ No newline at end of file diff --git a/tests/baselines/reference/unionsOfTupleTypes1.js b/tests/baselines/reference/unionsOfTupleTypes1.js new file mode 100644 index 00000000000..de21e1153d0 --- /dev/null +++ b/tests/baselines/reference/unionsOfTupleTypes1.js @@ -0,0 +1,99 @@ +//// [unionsOfTupleTypes1.ts] +type T1 = [string, number]; +type T2 = [boolean] | [string, number]; +type T3 = [string, ...number[]]; +type T4 = [boolean] | [string, ...number[]]; + +type T10 = T1[0]; // string +type T11 = T1[1]; // number +type T12 = T1[2]; // undefined +type T1N = T1[number]; // string | number + +type T20 = T2[0]; // string | boolean +type T21 = T2[1]; // number | undefined +type T22 = T2[2]; // undefined +type T2N = T2[number]; // string | number | boolean + +type T30 = T3[0]; // string +type T31 = T3[1]; // number +type T32 = T3[2]; // number +type T3N = T3[number]; // string | number + +type T40 = T4[0]; // string | boolean +type T41 = T4[1]; // number | undefined +type T42 = T4[2]; // number | undefined +type T4N = T4[number]; // string | number | boolean + +function f1(t1: T1, t2: T2, t3: T3, t4: T4, x: number) { + let [d10, d11, d12] = t1; // string, number + let [d20, d21, d22] = t2; // string | boolean, number | undefined + let [d30, d31, d32] = t3; // string, number, number + let [d40, d41, d42] = t4; // string | boolean, number | undefined, number | undefined + [d10, d11, d12] = t1; + [d20, d21, d22] = t2; + [d30, d31, d32] = t3; + [d40, d41, d42] = t4; + let t10 = t1[0]; // string + let t11 = t1[1]; // number + let t12 = t1[2]; // undefined + let t1x = t1[x]; // string | number + let t20 = t2[0]; // string | boolean + let t21 = t2[1]; // number | undefined + let t22 = t2[2]; // undefined + let t2x = t2[x]; // string | number | boolean + let t30 = t3[0]; // string + let t31 = t3[1]; // number + let t32 = t3[2]; // number + let t3x = t3[x]; // string | number + let t40 = t4[0]; // string | boolean + let t41 = t4[1]; // number | undefined + let t42 = t4[2]; // number | undefined + let t4x = t4[x]; // string | number | boolean + t1[1] = 42; + t2[1] = 42; + t3[1] = 42; + t4[1] = 42; +} + +// Repro from #27543 + +type Unioned = [string] | [string, number]; +const ex: Unioned = ["hi"] as Unioned; + +const [x, y] = ex; + + +//// [unionsOfTupleTypes1.js] +"use strict"; +function f1(t1, t2, t3, t4, x) { + var d10 = t1[0], d11 = t1[1], d12 = t1[2]; // string, number + var d20 = t2[0], d21 = t2[1], d22 = t2[2]; // string | boolean, number | undefined + var d30 = t3[0], d31 = t3[1], d32 = t3[2]; // string, number, number + var d40 = t4[0], d41 = t4[1], d42 = t4[2]; // string | boolean, number | undefined, number | undefined + d10 = t1[0], d11 = t1[1], d12 = t1[2]; + d20 = t2[0], d21 = t2[1], d22 = t2[2]; + d30 = t3[0], d31 = t3[1], d32 = t3[2]; + d40 = t4[0], d41 = t4[1], d42 = t4[2]; + var t10 = t1[0]; // string + var t11 = t1[1]; // number + var t12 = t1[2]; // undefined + var t1x = t1[x]; // string | number + var t20 = t2[0]; // string | boolean + var t21 = t2[1]; // number | undefined + var t22 = t2[2]; // undefined + var t2x = t2[x]; // string | number | boolean + var t30 = t3[0]; // string + var t31 = t3[1]; // number + var t32 = t3[2]; // number + var t3x = t3[x]; // string | number + var t40 = t4[0]; // string | boolean + var t41 = t4[1]; // number | undefined + var t42 = t4[2]; // number | undefined + var t4x = t4[x]; // string | number | boolean + t1[1] = 42; + t2[1] = 42; + t3[1] = 42; + t4[1] = 42; +} +var ex = ["hi"]; +var x = ex[0], y = ex[1]; diff --git a/tests/baselines/reference/unionsOfTupleTypes1.symbols b/tests/baselines/reference/unionsOfTupleTypes1.symbols new file mode 100644 index 00000000000..8d9b9185e54 --- /dev/null +++ b/tests/baselines/reference/unionsOfTupleTypes1.symbols @@ -0,0 +1,241 @@ +=== tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts === +type T1 = [string, number]; +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) + +type T2 = [boolean] | [string, number]; +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) + +type T3 = [string, ...number[]]; +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) + +type T4 = [boolean] | [string, ...number[]]; +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) + +type T10 = T1[0]; // string +>T10 : Symbol(T10, Decl(unionsOfTupleTypes1.ts, 3, 44)) +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) + +type T11 = T1[1]; // number +>T11 : Symbol(T11, Decl(unionsOfTupleTypes1.ts, 5, 17)) +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) + +type T12 = T1[2]; // undefined +>T12 : Symbol(T12, Decl(unionsOfTupleTypes1.ts, 6, 17)) +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) + +type T1N = T1[number]; // string | number +>T1N : Symbol(T1N, Decl(unionsOfTupleTypes1.ts, 7, 17)) +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) + +type T20 = T2[0]; // string | boolean +>T20 : Symbol(T20, Decl(unionsOfTupleTypes1.ts, 8, 22)) +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) + +type T21 = T2[1]; // number | undefined +>T21 : Symbol(T21, Decl(unionsOfTupleTypes1.ts, 10, 17)) +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) + +type T22 = T2[2]; // undefined +>T22 : Symbol(T22, Decl(unionsOfTupleTypes1.ts, 11, 17)) +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) + +type T2N = T2[number]; // string | number | boolean +>T2N : Symbol(T2N, Decl(unionsOfTupleTypes1.ts, 12, 17)) +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) + +type T30 = T3[0]; // string +>T30 : Symbol(T30, Decl(unionsOfTupleTypes1.ts, 13, 22)) +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) + +type T31 = T3[1]; // number +>T31 : Symbol(T31, Decl(unionsOfTupleTypes1.ts, 15, 17)) +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) + +type T32 = T3[2]; // number +>T32 : Symbol(T32, Decl(unionsOfTupleTypes1.ts, 16, 17)) +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) + +type T3N = T3[number]; // string | number +>T3N : Symbol(T3N, Decl(unionsOfTupleTypes1.ts, 17, 17)) +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) + +type T40 = T4[0]; // string | boolean +>T40 : Symbol(T40, Decl(unionsOfTupleTypes1.ts, 18, 22)) +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) + +type T41 = T4[1]; // number | undefined +>T41 : Symbol(T41, Decl(unionsOfTupleTypes1.ts, 20, 17)) +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) + +type T42 = T4[2]; // number | undefined +>T42 : Symbol(T42, Decl(unionsOfTupleTypes1.ts, 21, 17)) +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) + +type T4N = T4[number]; // string | number | boolean +>T4N : Symbol(T4N, Decl(unionsOfTupleTypes1.ts, 22, 17)) +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) + +function f1(t1: T1, t2: T2, t3: T3, t4: T4, x: number) { +>f1 : Symbol(f1, Decl(unionsOfTupleTypes1.ts, 23, 22)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) +>T1 : Symbol(T1, Decl(unionsOfTupleTypes1.ts, 0, 0)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) +>T2 : Symbol(T2, Decl(unionsOfTupleTypes1.ts, 0, 27)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) +>T3 : Symbol(T3, Decl(unionsOfTupleTypes1.ts, 1, 39)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) +>T4 : Symbol(T4, Decl(unionsOfTupleTypes1.ts, 2, 32)) +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 25, 43)) + + let [d10, d11, d12] = t1; // string, number +>d10 : Symbol(d10, Decl(unionsOfTupleTypes1.ts, 26, 9)) +>d11 : Symbol(d11, Decl(unionsOfTupleTypes1.ts, 26, 13)) +>d12 : Symbol(d12, Decl(unionsOfTupleTypes1.ts, 26, 18)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) + + let [d20, d21, d22] = t2; // string | boolean, number | undefined +>d20 : Symbol(d20, Decl(unionsOfTupleTypes1.ts, 27, 9)) +>d21 : Symbol(d21, Decl(unionsOfTupleTypes1.ts, 27, 13)) +>d22 : Symbol(d22, Decl(unionsOfTupleTypes1.ts, 27, 18)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) + + let [d30, d31, d32] = t3; // string, number, number +>d30 : Symbol(d30, Decl(unionsOfTupleTypes1.ts, 28, 9)) +>d31 : Symbol(d31, Decl(unionsOfTupleTypes1.ts, 28, 13)) +>d32 : Symbol(d32, Decl(unionsOfTupleTypes1.ts, 28, 18)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) + + let [d40, d41, d42] = t4; // string | boolean, number | undefined, number | undefined +>d40 : Symbol(d40, Decl(unionsOfTupleTypes1.ts, 29, 9)) +>d41 : Symbol(d41, Decl(unionsOfTupleTypes1.ts, 29, 13)) +>d42 : Symbol(d42, Decl(unionsOfTupleTypes1.ts, 29, 18)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) + + [d10, d11, d12] = t1; +>d10 : Symbol(d10, Decl(unionsOfTupleTypes1.ts, 26, 9)) +>d11 : Symbol(d11, Decl(unionsOfTupleTypes1.ts, 26, 13)) +>d12 : Symbol(d12, Decl(unionsOfTupleTypes1.ts, 26, 18)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) + + [d20, d21, d22] = t2; +>d20 : Symbol(d20, Decl(unionsOfTupleTypes1.ts, 27, 9)) +>d21 : Symbol(d21, Decl(unionsOfTupleTypes1.ts, 27, 13)) +>d22 : Symbol(d22, Decl(unionsOfTupleTypes1.ts, 27, 18)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) + + [d30, d31, d32] = t3; +>d30 : Symbol(d30, Decl(unionsOfTupleTypes1.ts, 28, 9)) +>d31 : Symbol(d31, Decl(unionsOfTupleTypes1.ts, 28, 13)) +>d32 : Symbol(d32, Decl(unionsOfTupleTypes1.ts, 28, 18)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) + + [d40, d41, d42] = t4; +>d40 : Symbol(d40, Decl(unionsOfTupleTypes1.ts, 29, 9)) +>d41 : Symbol(d41, Decl(unionsOfTupleTypes1.ts, 29, 13)) +>d42 : Symbol(d42, Decl(unionsOfTupleTypes1.ts, 29, 18)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) + + let t10 = t1[0]; // string +>t10 : Symbol(t10, Decl(unionsOfTupleTypes1.ts, 34, 7)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) +>0 : Symbol(0) + + let t11 = t1[1]; // number +>t11 : Symbol(t11, Decl(unionsOfTupleTypes1.ts, 35, 7)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) +>1 : Symbol(1) + + let t12 = t1[2]; // undefined +>t12 : Symbol(t12, Decl(unionsOfTupleTypes1.ts, 36, 7)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) + + let t1x = t1[x]; // string | number +>t1x : Symbol(t1x, Decl(unionsOfTupleTypes1.ts, 37, 7)) +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 25, 43)) + + let t20 = t2[0]; // string | boolean +>t20 : Symbol(t20, Decl(unionsOfTupleTypes1.ts, 38, 7)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) +>0 : Symbol(0) + + let t21 = t2[1]; // number | undefined +>t21 : Symbol(t21, Decl(unionsOfTupleTypes1.ts, 39, 7)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) +>1 : Symbol(1) + + let t22 = t2[2]; // undefined +>t22 : Symbol(t22, Decl(unionsOfTupleTypes1.ts, 40, 7)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) + + let t2x = t2[x]; // string | number | boolean +>t2x : Symbol(t2x, Decl(unionsOfTupleTypes1.ts, 41, 7)) +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 25, 43)) + + let t30 = t3[0]; // string +>t30 : Symbol(t30, Decl(unionsOfTupleTypes1.ts, 42, 7)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) +>0 : Symbol(0) + + let t31 = t3[1]; // number +>t31 : Symbol(t31, Decl(unionsOfTupleTypes1.ts, 43, 7)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) + + let t32 = t3[2]; // number +>t32 : Symbol(t32, Decl(unionsOfTupleTypes1.ts, 44, 7)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) + + let t3x = t3[x]; // string | number +>t3x : Symbol(t3x, Decl(unionsOfTupleTypes1.ts, 45, 7)) +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 25, 43)) + + let t40 = t4[0]; // string | boolean +>t40 : Symbol(t40, Decl(unionsOfTupleTypes1.ts, 46, 7)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) +>0 : Symbol(0) + + let t41 = t4[1]; // number | undefined +>t41 : Symbol(t41, Decl(unionsOfTupleTypes1.ts, 47, 7)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) + + let t42 = t4[2]; // number | undefined +>t42 : Symbol(t42, Decl(unionsOfTupleTypes1.ts, 48, 7)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) + + let t4x = t4[x]; // string | number | boolean +>t4x : Symbol(t4x, Decl(unionsOfTupleTypes1.ts, 49, 7)) +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 25, 43)) + + t1[1] = 42; +>t1 : Symbol(t1, Decl(unionsOfTupleTypes1.ts, 25, 12)) +>1 : Symbol(1) + + t2[1] = 42; +>t2 : Symbol(t2, Decl(unionsOfTupleTypes1.ts, 25, 19)) +>1 : Symbol(1) + + t3[1] = 42; +>t3 : Symbol(t3, Decl(unionsOfTupleTypes1.ts, 25, 27)) + + t4[1] = 42; +>t4 : Symbol(t4, Decl(unionsOfTupleTypes1.ts, 25, 35)) +} + +// Repro from #27543 + +type Unioned = [string] | [string, number]; +>Unioned : Symbol(Unioned, Decl(unionsOfTupleTypes1.ts, 54, 1)) + +const ex: Unioned = ["hi"] as Unioned; +>ex : Symbol(ex, Decl(unionsOfTupleTypes1.ts, 59, 5)) +>Unioned : Symbol(Unioned, Decl(unionsOfTupleTypes1.ts, 54, 1)) +>Unioned : Symbol(Unioned, Decl(unionsOfTupleTypes1.ts, 54, 1)) + +const [x, y] = ex; +>x : Symbol(x, Decl(unionsOfTupleTypes1.ts, 61, 7)) +>y : Symbol(y, Decl(unionsOfTupleTypes1.ts, 61, 9)) +>ex : Symbol(ex, Decl(unionsOfTupleTypes1.ts, 59, 5)) + diff --git a/tests/baselines/reference/unionsOfTupleTypes1.types b/tests/baselines/reference/unionsOfTupleTypes1.types new file mode 100644 index 00000000000..e44114f5a6a --- /dev/null +++ b/tests/baselines/reference/unionsOfTupleTypes1.types @@ -0,0 +1,266 @@ +=== tests/cases/conformance/types/tuple/unionsOfTupleTypes1.ts === +type T1 = [string, number]; +>T1 : [string, number] + +type T2 = [boolean] | [string, number]; +>T2 : T2 + +type T3 = [string, ...number[]]; +>T3 : [string, ...number[]] + +type T4 = [boolean] | [string, ...number[]]; +>T4 : T4 + +type T10 = T1[0]; // string +>T10 : string + +type T11 = T1[1]; // number +>T11 : number + +type T12 = T1[2]; // undefined +>T12 : undefined + +type T1N = T1[number]; // string | number +>T1N : string | number + +type T20 = T2[0]; // string | boolean +>T20 : string | boolean + +type T21 = T2[1]; // number | undefined +>T21 : number | undefined + +type T22 = T2[2]; // undefined +>T22 : undefined + +type T2N = T2[number]; // string | number | boolean +>T2N : string | number | boolean + +type T30 = T3[0]; // string +>T30 : string + +type T31 = T3[1]; // number +>T31 : number + +type T32 = T3[2]; // number +>T32 : number + +type T3N = T3[number]; // string | number +>T3N : string | number + +type T40 = T4[0]; // string | boolean +>T40 : string | boolean + +type T41 = T4[1]; // number | undefined +>T41 : number | undefined + +type T42 = T4[2]; // number | undefined +>T42 : number | undefined + +type T4N = T4[number]; // string | number | boolean +>T4N : string | number | boolean + +function f1(t1: T1, t2: T2, t3: T3, t4: T4, x: number) { +>f1 : (t1: [string, number], t2: T2, t3: [string, ...number[]], t4: T4, x: number) => void +>t1 : [string, number] +>t2 : T2 +>t3 : [string, ...number[]] +>t4 : T4 +>x : number + + let [d10, d11, d12] = t1; // string, number +>d10 : string +>d11 : number +>d12 : any +>t1 : [string, number] + + let [d20, d21, d22] = t2; // string | boolean, number | undefined +>d20 : string | boolean +>d21 : number | undefined +>d22 : any +>t2 : T2 + + let [d30, d31, d32] = t3; // string, number, number +>d30 : string +>d31 : number +>d32 : number +>t3 : [string, ...number[]] + + let [d40, d41, d42] = t4; // string | boolean, number | undefined, number | undefined +>d40 : string | boolean +>d41 : number | undefined +>d42 : number | undefined +>t4 : T4 + + [d10, d11, d12] = t1; +>[d10, d11, d12] = t1 : [string, number] +>[d10, d11, d12] : [string, number, any] +>d10 : string +>d11 : number +>d12 : any +>t1 : [string, number] + + [d20, d21, d22] = t2; +>[d20, d21, d22] = t2 : T2 +>[d20, d21, d22] : [string | boolean, number | undefined, any] +>d20 : string | boolean +>d21 : number | undefined +>d22 : any +>t2 : T2 + + [d30, d31, d32] = t3; +>[d30, d31, d32] = t3 : [string, ...number[]] +>[d30, d31, d32] : [string, number, number] +>d30 : string +>d31 : number +>d32 : number +>t3 : [string, ...number[]] + + [d40, d41, d42] = t4; +>[d40, d41, d42] = t4 : T4 +>[d40, d41, d42] : [string | boolean, number | undefined, number | undefined] +>d40 : string | boolean +>d41 : number | undefined +>d42 : number | undefined +>t4 : T4 + + let t10 = t1[0]; // string +>t10 : string +>t1[0] : string +>t1 : [string, number] +>0 : 0 + + let t11 = t1[1]; // number +>t11 : number +>t1[1] : number +>t1 : [string, number] +>1 : 1 + + let t12 = t1[2]; // undefined +>t12 : undefined +>t1[2] : undefined +>t1 : [string, number] +>2 : 2 + + let t1x = t1[x]; // string | number +>t1x : string | number +>t1[x] : string | number +>t1 : [string, number] +>x : number + + let t20 = t2[0]; // string | boolean +>t20 : string | boolean +>t2[0] : string | boolean +>t2 : T2 +>0 : 0 + + let t21 = t2[1]; // number | undefined +>t21 : number | undefined +>t2[1] : number | undefined +>t2 : T2 +>1 : 1 + + let t22 = t2[2]; // undefined +>t22 : undefined +>t2[2] : undefined +>t2 : T2 +>2 : 2 + + let t2x = t2[x]; // string | number | boolean +>t2x : string | number | boolean +>t2[x] : string | number | boolean +>t2 : T2 +>x : number + + let t30 = t3[0]; // string +>t30 : string +>t3[0] : string +>t3 : [string, ...number[]] +>0 : 0 + + let t31 = t3[1]; // number +>t31 : number +>t3[1] : number +>t3 : [string, ...number[]] +>1 : 1 + + let t32 = t3[2]; // number +>t32 : number +>t3[2] : number +>t3 : [string, ...number[]] +>2 : 2 + + let t3x = t3[x]; // string | number +>t3x : string | number +>t3[x] : string | number +>t3 : [string, ...number[]] +>x : number + + let t40 = t4[0]; // string | boolean +>t40 : string | boolean +>t4[0] : string | boolean +>t4 : T4 +>0 : 0 + + let t41 = t4[1]; // number | undefined +>t41 : number | undefined +>t4[1] : number | undefined +>t4 : T4 +>1 : 1 + + let t42 = t4[2]; // number | undefined +>t42 : number | undefined +>t4[2] : number | undefined +>t4 : T4 +>2 : 2 + + let t4x = t4[x]; // string | number | boolean +>t4x : string | number | boolean +>t4[x] : string | number | boolean +>t4 : T4 +>x : number + + t1[1] = 42; +>t1[1] = 42 : 42 +>t1[1] : number +>t1 : [string, number] +>1 : 1 +>42 : 42 + + t2[1] = 42; +>t2[1] = 42 : 42 +>t2[1] : number | undefined +>t2 : T2 +>1 : 1 +>42 : 42 + + t3[1] = 42; +>t3[1] = 42 : 42 +>t3[1] : number +>t3 : [string, ...number[]] +>1 : 1 +>42 : 42 + + t4[1] = 42; +>t4[1] = 42 : 42 +>t4[1] : number | undefined +>t4 : T4 +>1 : 1 +>42 : 42 +} + +// Repro from #27543 + +type Unioned = [string] | [string, number]; +>Unioned : Unioned + +const ex: Unioned = ["hi"] as Unioned; +>ex : Unioned +>["hi"] as Unioned : Unioned +>["hi"] : [string] +>"hi" : "hi" + +const [x, y] = ex; +>x : string +>y : number | undefined +>ex : Unioned +