Skip to content

Commit 6722ef1

Browse files
authored
Add a test for a destructured union with tuple members (microsoft#46656)
1 parent 67f84ef commit 6722ef1

File tree

4 files changed

+157
-66
lines changed

4 files changed

+157
-66
lines changed

tests/baselines/reference/dependentDestructuredVariables.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,17 @@ function f30({ kind, isA }: Foo) {
112112
}
113113
}
114114

115+
type Args = ['A', number] | ['B', string]
116+
117+
function f40(...[kind, data]: Args) {
118+
if (kind === 'A') {
119+
data.toFixed();
120+
}
121+
if (kind === 'B') {
122+
data.toUpperCase();
123+
}
124+
}
125+
115126
// Repro from #35283
116127

117128
interface A<T> { variant: 'a', value: T }
@@ -252,6 +263,14 @@ function f30({ kind, isA }) {
252263
kind; // 'B' | 'C'
253264
}
254265
}
266+
function f40(...[kind, data]) {
267+
if (kind === 'A') {
268+
data.toFixed();
269+
}
270+
if (kind === 'B') {
271+
data.toUpperCase();
272+
}
273+
}
255274
function unrefined1(ab) {
256275
const { variant, value } = ab;
257276
if (variant === 'a') {
@@ -308,6 +327,8 @@ declare type Foo = {
308327
isA: false;
309328
};
310329
declare function f30({ kind, isA }: Foo): void;
330+
declare type Args = ['A', number] | ['B', string];
331+
declare function f40(...[kind, data]: Args): void;
311332
interface A<T> {
312333
variant: 'a';
313334
value: T;

tests/baselines/reference/dependentDestructuredVariables.symbols

Lines changed: 93 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -280,130 +280,157 @@ function f30({ kind, isA }: Foo) {
280280
}
281281
}
282282

283+
type Args = ['A', number] | ['B', string]
284+
>Args : Symbol(Args, Decl(dependentDestructuredVariables.ts, 111, 1))
285+
286+
function f40(...[kind, data]: Args) {
287+
>f40 : Symbol(f40, Decl(dependentDestructuredVariables.ts, 113, 41))
288+
>kind : Symbol(kind, Decl(dependentDestructuredVariables.ts, 115, 17))
289+
>data : Symbol(data, Decl(dependentDestructuredVariables.ts, 115, 22))
290+
>Args : Symbol(Args, Decl(dependentDestructuredVariables.ts, 111, 1))
291+
292+
if (kind === 'A') {
293+
>kind : Symbol(kind, Decl(dependentDestructuredVariables.ts, 115, 17))
294+
295+
data.toFixed();
296+
>data.toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
297+
>data : Symbol(data, Decl(dependentDestructuredVariables.ts, 115, 22))
298+
>toFixed : Symbol(Number.toFixed, Decl(lib.es5.d.ts, --, --))
299+
}
300+
if (kind === 'B') {
301+
>kind : Symbol(kind, Decl(dependentDestructuredVariables.ts, 115, 17))
302+
303+
data.toUpperCase();
304+
>data.toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --))
305+
>data : Symbol(data, Decl(dependentDestructuredVariables.ts, 115, 22))
306+
>toUpperCase : Symbol(String.toUpperCase, Decl(lib.es5.d.ts, --, --))
307+
}
308+
}
309+
283310
// Repro from #35283
284311

285312
interface A<T> { variant: 'a', value: T }
286-
>A : Symbol(A, Decl(dependentDestructuredVariables.ts, 111, 1))
287-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 115, 12))
288-
>variant : Symbol(A.variant, Decl(dependentDestructuredVariables.ts, 115, 16))
289-
>value : Symbol(A.value, Decl(dependentDestructuredVariables.ts, 115, 30))
290-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 115, 12))
313+
>A : Symbol(A, Decl(dependentDestructuredVariables.ts, 122, 1))
314+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 126, 12))
315+
>variant : Symbol(A.variant, Decl(dependentDestructuredVariables.ts, 126, 16))
316+
>value : Symbol(A.value, Decl(dependentDestructuredVariables.ts, 126, 30))
317+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 126, 12))
291318

292319
interface B<T> { variant: 'b', value: Array<T> }
293-
>B : Symbol(B, Decl(dependentDestructuredVariables.ts, 115, 41))
294-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 117, 12))
295-
>variant : Symbol(B.variant, Decl(dependentDestructuredVariables.ts, 117, 16))
296-
>value : Symbol(B.value, Decl(dependentDestructuredVariables.ts, 117, 30))
320+
>B : Symbol(B, Decl(dependentDestructuredVariables.ts, 126, 41))
321+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 128, 12))
322+
>variant : Symbol(B.variant, Decl(dependentDestructuredVariables.ts, 128, 16))
323+
>value : Symbol(B.value, Decl(dependentDestructuredVariables.ts, 128, 30))
297324
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
298-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 117, 12))
325+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 128, 12))
299326

300327
type AB<T> = A<T> | B<T>;
301-
>AB : Symbol(AB, Decl(dependentDestructuredVariables.ts, 117, 48))
302-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 119, 8))
303-
>A : Symbol(A, Decl(dependentDestructuredVariables.ts, 111, 1))
304-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 119, 8))
305-
>B : Symbol(B, Decl(dependentDestructuredVariables.ts, 115, 41))
306-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 119, 8))
328+
>AB : Symbol(AB, Decl(dependentDestructuredVariables.ts, 128, 48))
329+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 130, 8))
330+
>A : Symbol(A, Decl(dependentDestructuredVariables.ts, 122, 1))
331+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 130, 8))
332+
>B : Symbol(B, Decl(dependentDestructuredVariables.ts, 126, 41))
333+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 130, 8))
307334

308335
declare function printValue<T>(t: T): void;
309-
>printValue : Symbol(printValue, Decl(dependentDestructuredVariables.ts, 119, 25))
310-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 121, 28))
311-
>t : Symbol(t, Decl(dependentDestructuredVariables.ts, 121, 31))
312-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 121, 28))
336+
>printValue : Symbol(printValue, Decl(dependentDestructuredVariables.ts, 130, 25))
337+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 132, 28))
338+
>t : Symbol(t, Decl(dependentDestructuredVariables.ts, 132, 31))
339+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 132, 28))
313340

314341
declare function printValueList<T>(t: Array<T>): void;
315-
>printValueList : Symbol(printValueList, Decl(dependentDestructuredVariables.ts, 121, 43))
316-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 123, 32))
317-
>t : Symbol(t, Decl(dependentDestructuredVariables.ts, 123, 35))
342+
>printValueList : Symbol(printValueList, Decl(dependentDestructuredVariables.ts, 132, 43))
343+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 134, 32))
344+
>t : Symbol(t, Decl(dependentDestructuredVariables.ts, 134, 35))
318345
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
319-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 123, 32))
346+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 134, 32))
320347

321348
function unrefined1<T>(ab: AB<T>): void {
322-
>unrefined1 : Symbol(unrefined1, Decl(dependentDestructuredVariables.ts, 123, 54))
323-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 125, 20))
324-
>ab : Symbol(ab, Decl(dependentDestructuredVariables.ts, 125, 23))
325-
>AB : Symbol(AB, Decl(dependentDestructuredVariables.ts, 117, 48))
326-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 125, 20))
349+
>unrefined1 : Symbol(unrefined1, Decl(dependentDestructuredVariables.ts, 134, 54))
350+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 136, 20))
351+
>ab : Symbol(ab, Decl(dependentDestructuredVariables.ts, 136, 23))
352+
>AB : Symbol(AB, Decl(dependentDestructuredVariables.ts, 128, 48))
353+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 136, 20))
327354

328355
const { variant, value } = ab;
329-
>variant : Symbol(variant, Decl(dependentDestructuredVariables.ts, 126, 11))
330-
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 126, 20))
331-
>ab : Symbol(ab, Decl(dependentDestructuredVariables.ts, 125, 23))
356+
>variant : Symbol(variant, Decl(dependentDestructuredVariables.ts, 137, 11))
357+
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 137, 20))
358+
>ab : Symbol(ab, Decl(dependentDestructuredVariables.ts, 136, 23))
332359

333360
if (variant === 'a') {
334-
>variant : Symbol(variant, Decl(dependentDestructuredVariables.ts, 126, 11))
361+
>variant : Symbol(variant, Decl(dependentDestructuredVariables.ts, 137, 11))
335362

336363
printValue<T>(value);
337-
>printValue : Symbol(printValue, Decl(dependentDestructuredVariables.ts, 119, 25))
338-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 125, 20))
339-
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 126, 20))
364+
>printValue : Symbol(printValue, Decl(dependentDestructuredVariables.ts, 130, 25))
365+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 136, 20))
366+
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 137, 20))
340367
}
341368
else {
342369
printValueList<T>(value);
343-
>printValueList : Symbol(printValueList, Decl(dependentDestructuredVariables.ts, 121, 43))
344-
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 125, 20))
345-
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 126, 20))
370+
>printValueList : Symbol(printValueList, Decl(dependentDestructuredVariables.ts, 132, 43))
371+
>T : Symbol(T, Decl(dependentDestructuredVariables.ts, 136, 20))
372+
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 137, 20))
346373
}
347374
}
348375

349376
// Repro from #38020
350377

351378
type Action3 =
352-
>Action3 : Symbol(Action3, Decl(dependentDestructuredVariables.ts, 133, 1))
379+
>Action3 : Symbol(Action3, Decl(dependentDestructuredVariables.ts, 144, 1))
353380

354381
| {type: 'add', payload: { toAdd: number } }
355-
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 138, 7))
356-
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 138, 19))
357-
>toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 138, 30))
382+
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 149, 7))
383+
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 149, 19))
384+
>toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 149, 30))
358385

359386
| {type: 'remove', payload: { toRemove: number } };
360-
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 139, 7))
361-
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 139, 22))
362-
>toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 139, 33))
387+
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 150, 7))
388+
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 150, 22))
389+
>toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 150, 33))
363390

364391
const reducerBroken = (state: number, { type, payload }: Action3) => {
365-
>reducerBroken : Symbol(reducerBroken, Decl(dependentDestructuredVariables.ts, 141, 5))
366-
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 141, 23))
367-
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 141, 39))
368-
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 141, 45))
369-
>Action3 : Symbol(Action3, Decl(dependentDestructuredVariables.ts, 133, 1))
392+
>reducerBroken : Symbol(reducerBroken, Decl(dependentDestructuredVariables.ts, 152, 5))
393+
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 152, 23))
394+
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 152, 39))
395+
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 152, 45))
396+
>Action3 : Symbol(Action3, Decl(dependentDestructuredVariables.ts, 144, 1))
370397

371398
switch (type) {
372-
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 141, 39))
399+
>type : Symbol(type, Decl(dependentDestructuredVariables.ts, 152, 39))
373400

374401
case 'add':
375402
return state + payload.toAdd;
376-
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 141, 23))
377-
>payload.toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 138, 30))
378-
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 141, 45))
379-
>toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 138, 30))
403+
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 152, 23))
404+
>payload.toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 149, 30))
405+
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 152, 45))
406+
>toAdd : Symbol(toAdd, Decl(dependentDestructuredVariables.ts, 149, 30))
380407

381408
case 'remove':
382409
return state - payload.toRemove;
383-
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 141, 23))
384-
>payload.toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 139, 33))
385-
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 141, 45))
386-
>toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 139, 33))
410+
>state : Symbol(state, Decl(dependentDestructuredVariables.ts, 152, 23))
411+
>payload.toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 150, 33))
412+
>payload : Symbol(payload, Decl(dependentDestructuredVariables.ts, 152, 45))
413+
>toRemove : Symbol(toRemove, Decl(dependentDestructuredVariables.ts, 150, 33))
387414
}
388415
}
389416

390417
// Repro from #46143
391418

392419
declare var it: Iterator<number>;
393-
>it : Symbol(it, Decl(dependentDestructuredVariables.ts, 152, 11))
420+
>it : Symbol(it, Decl(dependentDestructuredVariables.ts, 163, 11))
394421
>Iterator : Symbol(Iterator, Decl(lib.es2015.iterable.d.ts, --, --))
395422

396423
const { value, done } = it.next();
397-
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 153, 7))
398-
>done : Symbol(done, Decl(dependentDestructuredVariables.ts, 153, 14))
424+
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 164, 7))
425+
>done : Symbol(done, Decl(dependentDestructuredVariables.ts, 164, 14))
399426
>it.next : Symbol(Iterator.next, Decl(lib.es2015.iterable.d.ts, --, --))
400-
>it : Symbol(it, Decl(dependentDestructuredVariables.ts, 152, 11))
427+
>it : Symbol(it, Decl(dependentDestructuredVariables.ts, 163, 11))
401428
>next : Symbol(Iterator.next, Decl(lib.es2015.iterable.d.ts, --, --))
402429

403430
if (!done) {
404-
>done : Symbol(done, Decl(dependentDestructuredVariables.ts, 153, 14))
431+
>done : Symbol(done, Decl(dependentDestructuredVariables.ts, 164, 14))
405432

406433
value; // number
407-
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 153, 7))
434+
>value : Symbol(value, Decl(dependentDestructuredVariables.ts, 164, 7))
408435
}
409436

tests/baselines/reference/dependentDestructuredVariables.types

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,38 @@ function f30({ kind, isA }: Foo) {
323323
}
324324
}
325325

326+
type Args = ['A', number] | ['B', string]
327+
>Args : Args
328+
329+
function f40(...[kind, data]: Args) {
330+
>f40 : (...[kind, data]: Args) => void
331+
>kind : "A" | "B"
332+
>data : string | number
333+
334+
if (kind === 'A') {
335+
>kind === 'A' : boolean
336+
>kind : "A" | "B"
337+
>'A' : "A"
338+
339+
data.toFixed();
340+
>data.toFixed() : string
341+
>data.toFixed : (fractionDigits?: number | undefined) => string
342+
>data : number
343+
>toFixed : (fractionDigits?: number | undefined) => string
344+
}
345+
if (kind === 'B') {
346+
>kind === 'B' : boolean
347+
>kind : "A" | "B"
348+
>'B' : "B"
349+
350+
data.toUpperCase();
351+
>data.toUpperCase() : string
352+
>data.toUpperCase : () => string
353+
>data : string
354+
>toUpperCase : () => string
355+
}
356+
}
357+
326358
// Repro from #35283
327359

328360
interface A<T> { variant: 'a', value: T }

tests/cases/conformance/controlFlow/dependentDestructuredVariables.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ function f30({ kind, isA }: Foo) {
115115
}
116116
}
117117

118+
type Args = ['A', number] | ['B', string]
119+
120+
function f40(...[kind, data]: Args) {
121+
if (kind === 'A') {
122+
data.toFixed();
123+
}
124+
if (kind === 'B') {
125+
data.toUpperCase();
126+
}
127+
}
128+
118129
// Repro from #35283
119130

120131
interface A<T> { variant: 'a', value: T }

0 commit comments

Comments
 (0)