Skip to content

Commit cd7165c

Browse files
committed
Add repro from comment in #49226
1 parent a923424 commit cd7165c

4 files changed

+127
-1
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
tests/cases/compiler/inferFromNestedSameShapeTuple.ts(42,5): error TS2322: Type 'T1<U>' is not assignable to type 'T2<U>'.
2+
Type at position 0 in source is not compatible with type at position 0 in target.
3+
Type 'number' is not assignable to type '42'.
4+
5+
6+
==== tests/cases/compiler/inferFromNestedSameShapeTuple.ts (1 errors) ====
7+
// repro #48524
8+
9+
type Magic<X> = X extends [[infer Y, ...infer _], ...infer __] ? Y : never;
10+
11+
type R = Magic<[[number]]>
12+
13+
// repro #52722
14+
15+
type Recursive<Id> = {
16+
id: Id
17+
children: readonly Recursive<Id>[]
18+
}
19+
20+
declare function getIds<Id>(items: readonly Recursive<Id>[]): Id[];
21+
22+
const items = [{
23+
id: 'a',
24+
children: [{
25+
id: 'b',
26+
children: []
27+
}]
28+
}] as const satisfies readonly Recursive<string>[]
29+
30+
const foo = getIds(items)
31+
32+
// variant with a fresh argument
33+
const foo2 = getIds([{
34+
id: 'a',
35+
children: [{
36+
id: 'b',
37+
children: []
38+
}]
39+
}] as const)
40+
41+
// Repro from comment in #49226
42+
43+
type T1<T> = [number, T1<{ x: T }>];
44+
type T2<T> = [42, T2<{ x: T }>];
45+
46+
function qq<U>(x: T1<U>, y: T2<U>) {
47+
x = y;
48+
y = x; // Error
49+
~
50+
!!! error TS2322: Type 'T1<U>' is not assignable to type 'T2<U>'.
51+
!!! error TS2322: Type at position 0 in source is not compatible with type at position 0 in target.
52+
!!! error TS2322: Type 'number' is not assignable to type '42'.
53+
}
54+

tests/baselines/reference/inferFromNestedSameShapeTuple.symbols

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,38 @@ const foo2 = getIds([{
8484
}] as const)
8585
>const : Symbol(const)
8686

87+
// Repro from comment in #49226
88+
89+
type T1<T> = [number, T1<{ x: T }>];
90+
>T1 : Symbol(T1, Decl(inferFromNestedSameShapeTuple.ts, 32, 12))
91+
>T : Symbol(T, Decl(inferFromNestedSameShapeTuple.ts, 36, 8))
92+
>T1 : Symbol(T1, Decl(inferFromNestedSameShapeTuple.ts, 32, 12))
93+
>x : Symbol(x, Decl(inferFromNestedSameShapeTuple.ts, 36, 26))
94+
>T : Symbol(T, Decl(inferFromNestedSameShapeTuple.ts, 36, 8))
95+
96+
type T2<T> = [42, T2<{ x: T }>];
97+
>T2 : Symbol(T2, Decl(inferFromNestedSameShapeTuple.ts, 36, 36))
98+
>T : Symbol(T, Decl(inferFromNestedSameShapeTuple.ts, 37, 8))
99+
>T2 : Symbol(T2, Decl(inferFromNestedSameShapeTuple.ts, 36, 36))
100+
>x : Symbol(x, Decl(inferFromNestedSameShapeTuple.ts, 37, 22))
101+
>T : Symbol(T, Decl(inferFromNestedSameShapeTuple.ts, 37, 8))
102+
103+
function qq<U>(x: T1<U>, y: T2<U>) {
104+
>qq : Symbol(qq, Decl(inferFromNestedSameShapeTuple.ts, 37, 32))
105+
>U : Symbol(U, Decl(inferFromNestedSameShapeTuple.ts, 39, 12))
106+
>x : Symbol(x, Decl(inferFromNestedSameShapeTuple.ts, 39, 15))
107+
>T1 : Symbol(T1, Decl(inferFromNestedSameShapeTuple.ts, 32, 12))
108+
>U : Symbol(U, Decl(inferFromNestedSameShapeTuple.ts, 39, 12))
109+
>y : Symbol(y, Decl(inferFromNestedSameShapeTuple.ts, 39, 24))
110+
>T2 : Symbol(T2, Decl(inferFromNestedSameShapeTuple.ts, 36, 36))
111+
>U : Symbol(U, Decl(inferFromNestedSameShapeTuple.ts, 39, 12))
112+
113+
x = y;
114+
>x : Symbol(x, Decl(inferFromNestedSameShapeTuple.ts, 39, 15))
115+
>y : Symbol(y, Decl(inferFromNestedSameShapeTuple.ts, 39, 24))
116+
117+
y = x; // Error
118+
>y : Symbol(y, Decl(inferFromNestedSameShapeTuple.ts, 39, 24))
119+
>x : Symbol(x, Decl(inferFromNestedSameShapeTuple.ts, 39, 15))
120+
}
121+

tests/baselines/reference/inferFromNestedSameShapeTuple.types

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,30 @@ const foo2 = getIds([{
8484

8585
}]
8686
}] as const)
87+
88+
// Repro from comment in #49226
89+
90+
type T1<T> = [number, T1<{ x: T }>];
91+
>T1 : T1<T>
92+
>x : T
93+
94+
type T2<T> = [42, T2<{ x: T }>];
95+
>T2 : T2<T>
96+
>x : T
97+
98+
function qq<U>(x: T1<U>, y: T2<U>) {
99+
>qq : <U>(x: T1<U>, y: T2<U>) => void
100+
>x : T1<U>
101+
>y : T2<U>
102+
103+
x = y;
104+
>x = y : T2<U>
105+
>x : T1<U>
106+
>y : T2<U>
107+
108+
y = x; // Error
109+
>y = x : T1<U>
110+
>y : T2<U>
111+
>x : T1<U>
112+
}
113+

tests/cases/compiler/inferFromNestedSameShapeTuple.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,14 @@ const foo2 = getIds([{
3333
id: 'b',
3434
children: []
3535
}]
36-
}] as const)
36+
}] as const)
37+
38+
// Repro from comment in #49226
39+
40+
type T1<T> = [number, T1<{ x: T }>];
41+
type T2<T> = [42, T2<{ x: T }>];
42+
43+
function qq<U>(x: T1<U>, y: T2<U>) {
44+
x = y;
45+
y = x; // Error
46+
}

0 commit comments

Comments
 (0)