@@ -55,3 +55,113 @@ function foo(arg: Circular<tup>): tup {
5555>arg : Symbol(arg, Decl(recursiveMappedTypes.ts, 19, 13))
5656}
5757
58+ // Repro from #29442
59+
60+ type DeepMap<T extends unknown[], R> = {
61+ >DeepMap : Symbol(DeepMap, Decl(recursiveMappedTypes.ts, 21, 1))
62+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 25, 13))
63+ >R : Symbol(R, Decl(recursiveMappedTypes.ts, 25, 33))
64+
65+ [K in keyof T]: T[K] extends unknown[] ? DeepMap<T[K], R> : R;
66+ >K : Symbol(K, Decl(recursiveMappedTypes.ts, 26, 3))
67+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 25, 13))
68+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 25, 13))
69+ >K : Symbol(K, Decl(recursiveMappedTypes.ts, 26, 3))
70+ >DeepMap : Symbol(DeepMap, Decl(recursiveMappedTypes.ts, 21, 1))
71+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 25, 13))
72+ >K : Symbol(K, Decl(recursiveMappedTypes.ts, 26, 3))
73+ >R : Symbol(R, Decl(recursiveMappedTypes.ts, 25, 33))
74+ >R : Symbol(R, Decl(recursiveMappedTypes.ts, 25, 33))
75+
76+ };
77+
78+ type tpl = [string, [string, [string]]];
79+ >tpl : Symbol(tpl, Decl(recursiveMappedTypes.ts, 27, 2))
80+
81+ type arr = string[][];
82+ >arr : Symbol(arr, Decl(recursiveMappedTypes.ts, 29, 40))
83+
84+ type t1 = DeepMap<tpl, number>; // [number, [number, [number]]]
85+ >t1 : Symbol(t1, Decl(recursiveMappedTypes.ts, 30, 22))
86+ >DeepMap : Symbol(DeepMap, Decl(recursiveMappedTypes.ts, 21, 1))
87+ >tpl : Symbol(tpl, Decl(recursiveMappedTypes.ts, 27, 2))
88+
89+ type t2 = DeepMap<arr, number>; // number[][]
90+ >t2 : Symbol(t2, Decl(recursiveMappedTypes.ts, 32, 31))
91+ >DeepMap : Symbol(DeepMap, Decl(recursiveMappedTypes.ts, 21, 1))
92+ >arr : Symbol(arr, Decl(recursiveMappedTypes.ts, 29, 40))
93+
94+ // Repro from #29577
95+
96+ type Transform<T> = { [K in keyof T]: Transform<T[K]> };
97+ >Transform : Symbol(Transform, Decl(recursiveMappedTypes.ts, 33, 31))
98+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 37, 15))
99+ >K : Symbol(K, Decl(recursiveMappedTypes.ts, 37, 23))
100+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 37, 15))
101+ >Transform : Symbol(Transform, Decl(recursiveMappedTypes.ts, 33, 31))
102+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 37, 15))
103+ >K : Symbol(K, Decl(recursiveMappedTypes.ts, 37, 23))
104+
105+ interface User {
106+ >User : Symbol(User, Decl(recursiveMappedTypes.ts, 37, 56))
107+
108+ avatar: string;
109+ >avatar : Symbol(User.avatar, Decl(recursiveMappedTypes.ts, 39, 16))
110+ }
111+
112+ interface Guest {
113+ >Guest : Symbol(Guest, Decl(recursiveMappedTypes.ts, 41, 1))
114+
115+ displayName: string;
116+ >displayName : Symbol(Guest.displayName, Decl(recursiveMappedTypes.ts, 43, 17))
117+ }
118+
119+ interface Product {
120+ >Product : Symbol(Product, Decl(recursiveMappedTypes.ts, 45, 1))
121+
122+ users: (User | Guest)[];
123+ >users : Symbol(Product.users, Decl(recursiveMappedTypes.ts, 47, 19))
124+ >User : Symbol(User, Decl(recursiveMappedTypes.ts, 37, 56))
125+ >Guest : Symbol(Guest, Decl(recursiveMappedTypes.ts, 41, 1))
126+ }
127+
128+ declare var product: Transform<Product>;
129+ >product : Symbol(product, Decl(recursiveMappedTypes.ts, 51, 11))
130+ >Transform : Symbol(Transform, Decl(recursiveMappedTypes.ts, 33, 31))
131+ >Product : Symbol(Product, Decl(recursiveMappedTypes.ts, 45, 1))
132+
133+ product.users; // (Transform<User> | Transform<Guest>)[]
134+ >product.users : Symbol(users, Decl(recursiveMappedTypes.ts, 47, 19))
135+ >product : Symbol(product, Decl(recursiveMappedTypes.ts, 51, 11))
136+ >users : Symbol(users, Decl(recursiveMappedTypes.ts, 47, 19))
137+
138+ // Repro from #29702
139+
140+ type Remap1<T> = { [P in keyof T]: Remap1<T[P]>; };
141+ >Remap1 : Symbol(Remap1, Decl(recursiveMappedTypes.ts, 52, 14))
142+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 56, 12))
143+ >P : Symbol(P, Decl(recursiveMappedTypes.ts, 56, 20))
144+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 56, 12))
145+ >Remap1 : Symbol(Remap1, Decl(recursiveMappedTypes.ts, 52, 14))
146+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 56, 12))
147+ >P : Symbol(P, Decl(recursiveMappedTypes.ts, 56, 20))
148+
149+ type Remap2<T> = T extends object ? { [P in keyof T]: Remap2<T[P]>; } : T;
150+ >Remap2 : Symbol(Remap2, Decl(recursiveMappedTypes.ts, 56, 51))
151+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 57, 12))
152+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 57, 12))
153+ >P : Symbol(P, Decl(recursiveMappedTypes.ts, 57, 39))
154+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 57, 12))
155+ >Remap2 : Symbol(Remap2, Decl(recursiveMappedTypes.ts, 56, 51))
156+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 57, 12))
157+ >P : Symbol(P, Decl(recursiveMappedTypes.ts, 57, 39))
158+ >T : Symbol(T, Decl(recursiveMappedTypes.ts, 57, 12))
159+
160+ type a = Remap1<string[]>; // string[]
161+ >a : Symbol(a, Decl(recursiveMappedTypes.ts, 57, 74))
162+ >Remap1 : Symbol(Remap1, Decl(recursiveMappedTypes.ts, 52, 14))
163+
164+ type b = Remap2<string[]>; // string[]
165+ >b : Symbol(b, Decl(recursiveMappedTypes.ts, 59, 26))
166+ >Remap2 : Symbol(Remap2, Decl(recursiveMappedTypes.ts, 56, 51))
167+
0 commit comments