Skip to content

Commit a7d5826

Browse files
committed
Add extra test cases
1 parent b1d5bf2 commit a7d5826

6 files changed

+208
-32
lines changed

tests/baselines/reference/conditionalTypeInferFromNestedSameShapeTuple.symbols

Lines changed: 0 additions & 16 deletions
This file was deleted.

tests/baselines/reference/conditionalTypeInferFromNestedSameShapeTuple.types

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
=== tests/cases/compiler/inferFromNestedSameShapeTuple.ts ===
2+
// repro #48524
3+
4+
type Magic<X> = X extends [[infer Y, ...infer _], ...infer __] ? Y : never;
5+
>Magic : Symbol(Magic, Decl(inferFromNestedSameShapeTuple.ts, 0, 0))
6+
>X : Symbol(X, Decl(inferFromNestedSameShapeTuple.ts, 2, 11))
7+
>X : Symbol(X, Decl(inferFromNestedSameShapeTuple.ts, 2, 11))
8+
>Y : Symbol(Y, Decl(inferFromNestedSameShapeTuple.ts, 2, 33))
9+
>_ : Symbol(_, Decl(inferFromNestedSameShapeTuple.ts, 2, 45))
10+
>__ : Symbol(__, Decl(inferFromNestedSameShapeTuple.ts, 2, 58))
11+
>Y : Symbol(Y, Decl(inferFromNestedSameShapeTuple.ts, 2, 33))
12+
13+
type R = Magic<[[number]]>
14+
>R : Symbol(R, Decl(inferFromNestedSameShapeTuple.ts, 2, 75))
15+
>Magic : Symbol(Magic, Decl(inferFromNestedSameShapeTuple.ts, 0, 0))
16+
17+
// repro #52722
18+
19+
type Recursive<Id> = {
20+
>Recursive : Symbol(Recursive, Decl(inferFromNestedSameShapeTuple.ts, 4, 26))
21+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 8, 15))
22+
23+
id: Id
24+
>id : Symbol(id, Decl(inferFromNestedSameShapeTuple.ts, 8, 22))
25+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 8, 15))
26+
27+
children: readonly Recursive<Id>[]
28+
>children : Symbol(children, Decl(inferFromNestedSameShapeTuple.ts, 9, 10))
29+
>Recursive : Symbol(Recursive, Decl(inferFromNestedSameShapeTuple.ts, 4, 26))
30+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 8, 15))
31+
}
32+
33+
declare function getIds<Id>(items: readonly Recursive<Id>[]): Id[];
34+
>getIds : Symbol(getIds, Decl(inferFromNestedSameShapeTuple.ts, 11, 1))
35+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 13, 24))
36+
>items : Symbol(items, Decl(inferFromNestedSameShapeTuple.ts, 13, 28))
37+
>Recursive : Symbol(Recursive, Decl(inferFromNestedSameShapeTuple.ts, 4, 26))
38+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 13, 24))
39+
>Id : Symbol(Id, Decl(inferFromNestedSameShapeTuple.ts, 13, 24))
40+
41+
const items = [{
42+
>items : Symbol(items, Decl(inferFromNestedSameShapeTuple.ts, 15, 5))
43+
44+
id: 'a',
45+
>id : Symbol(id, Decl(inferFromNestedSameShapeTuple.ts, 15, 16))
46+
47+
children: [{
48+
>children : Symbol(children, Decl(inferFromNestedSameShapeTuple.ts, 16, 12))
49+
50+
id: 'b',
51+
>id : Symbol(id, Decl(inferFromNestedSameShapeTuple.ts, 17, 16))
52+
53+
children: []
54+
>children : Symbol(children, Decl(inferFromNestedSameShapeTuple.ts, 18, 16))
55+
56+
}]
57+
}] as const satisfies readonly Recursive<string>[]
58+
>const : Symbol(const)
59+
>Recursive : Symbol(Recursive, Decl(inferFromNestedSameShapeTuple.ts, 4, 26))
60+
61+
const foo = getIds(items)
62+
>foo : Symbol(foo, Decl(inferFromNestedSameShapeTuple.ts, 23, 5))
63+
>getIds : Symbol(getIds, Decl(inferFromNestedSameShapeTuple.ts, 11, 1))
64+
>items : Symbol(items, Decl(inferFromNestedSameShapeTuple.ts, 15, 5))
65+
66+
// variant with a fresh argument
67+
const foo2 = getIds([{
68+
>foo2 : Symbol(foo2, Decl(inferFromNestedSameShapeTuple.ts, 26, 5))
69+
>getIds : Symbol(getIds, Decl(inferFromNestedSameShapeTuple.ts, 11, 1))
70+
71+
id: 'a',
72+
>id : Symbol(id, Decl(inferFromNestedSameShapeTuple.ts, 26, 22))
73+
74+
children: [{
75+
>children : Symbol(children, Decl(inferFromNestedSameShapeTuple.ts, 27, 12))
76+
77+
id: 'b',
78+
>id : Symbol(id, Decl(inferFromNestedSameShapeTuple.ts, 28, 16))
79+
80+
children: []
81+
>children : Symbol(children, Decl(inferFromNestedSameShapeTuple.ts, 29, 16))
82+
83+
}]
84+
}] as const)
85+
>const : Symbol(const)
86+
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
=== tests/cases/compiler/inferFromNestedSameShapeTuple.ts ===
2+
// repro #48524
3+
4+
type Magic<X> = X extends [[infer Y, ...infer _], ...infer __] ? Y : never;
5+
>Magic : Magic<X>
6+
7+
type R = Magic<[[number]]>
8+
>R : number
9+
10+
// repro #52722
11+
12+
type Recursive<Id> = {
13+
>Recursive : Recursive<Id>
14+
15+
id: Id
16+
>id : Id
17+
18+
children: readonly Recursive<Id>[]
19+
>children : readonly Recursive<Id>[]
20+
}
21+
22+
declare function getIds<Id>(items: readonly Recursive<Id>[]): Id[];
23+
>getIds : <Id>(items: readonly Recursive<Id>[]) => Id[]
24+
>items : readonly Recursive<Id>[]
25+
26+
const items = [{
27+
>items : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
28+
>[{ id: 'a', children: [{ id: 'b', children: [] }]}] as const satisfies readonly Recursive<string>[] : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
29+
>[{ id: 'a', children: [{ id: 'b', children: [] }]}] as const : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
30+
>[{ id: 'a', children: [{ id: 'b', children: [] }]}] : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
31+
>{ id: 'a', children: [{ id: 'b', children: [] }]} : { readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }
32+
33+
id: 'a',
34+
>id : "a"
35+
>'a' : "a"
36+
37+
children: [{
38+
>children : readonly [{ readonly id: "b"; readonly children: readonly []; }]
39+
>[{ id: 'b', children: [] }] : readonly [{ readonly id: "b"; readonly children: readonly []; }]
40+
>{ id: 'b', children: [] } : { readonly id: "b"; readonly children: readonly []; }
41+
42+
id: 'b',
43+
>id : "b"
44+
>'b' : "b"
45+
46+
children: []
47+
>children : readonly []
48+
>[] : readonly []
49+
50+
}]
51+
}] as const satisfies readonly Recursive<string>[]
52+
53+
const foo = getIds(items)
54+
>foo : ("a" | "b")[]
55+
>getIds(items) : ("a" | "b")[]
56+
>getIds : <Id>(items: readonly Recursive<Id>[]) => Id[]
57+
>items : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
58+
59+
// variant with a fresh argument
60+
const foo2 = getIds([{
61+
>foo2 : ("a" | "b")[]
62+
>getIds([{ id: 'a', children: [{ id: 'b', children: [] }]}] as const) : ("a" | "b")[]
63+
>getIds : <Id>(items: readonly Recursive<Id>[]) => Id[]
64+
>[{ id: 'a', children: [{ id: 'b', children: [] }]}] as const : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
65+
>[{ id: 'a', children: [{ id: 'b', children: [] }]}] : readonly [{ readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }]
66+
>{ id: 'a', children: [{ id: 'b', children: [] }]} : { readonly id: "a"; readonly children: readonly [{ readonly id: "b"; readonly children: readonly []; }]; }
67+
68+
id: 'a',
69+
>id : "a"
70+
>'a' : "a"
71+
72+
children: [{
73+
>children : readonly [{ readonly id: "b"; readonly children: readonly []; }]
74+
>[{ id: 'b', children: [] }] : readonly [{ readonly id: "b"; readonly children: readonly []; }]
75+
>{ id: 'b', children: [] } : { readonly id: "b"; readonly children: readonly []; }
76+
77+
id: 'b',
78+
>id : "b"
79+
>'b' : "b"
80+
81+
children: []
82+
>children : readonly []
83+
>[] : readonly []
84+
85+
}]
86+
}] as const)

tests/cases/compiler/conditionalTypeInferFromNestedSameShapeTuple.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// repro #48524
5+
6+
type Magic<X> = X extends [[infer Y, ...infer _], ...infer __] ? Y : never;
7+
8+
type R = Magic<[[number]]>
9+
10+
// repro #52722
11+
12+
type Recursive<Id> = {
13+
id: Id
14+
children: readonly Recursive<Id>[]
15+
}
16+
17+
declare function getIds<Id>(items: readonly Recursive<Id>[]): Id[];
18+
19+
const items = [{
20+
id: 'a',
21+
children: [{
22+
id: 'b',
23+
children: []
24+
}]
25+
}] as const satisfies readonly Recursive<string>[]
26+
27+
const foo = getIds(items)
28+
29+
// variant with a fresh argument
30+
const foo2 = getIds([{
31+
id: 'a',
32+
children: [{
33+
id: 'b',
34+
children: []
35+
}]
36+
}] as const)

0 commit comments

Comments
 (0)