Accept new baselines

This commit is contained in:
Anders Hejlsberg 2018-10-06 17:03:27 -07:00
parent d4f480cbbb
commit 86704e5bf9
4 changed files with 687 additions and 0 deletions

View File

@ -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;

View File

@ -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];

View File

@ -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))

View File

@ -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