@@ -90,6 +90,15 @@ type T76<T extends T[], U extends T> = { x: T };
90
90
type T77 < T > = T extends T76 < infer X , infer Y > ? T76 < X , Y > : never ;
91
91
type T78 < T > = T extends T76 < infer X , infer X > ? T76 < X , X > : never ;
92
92
93
+ type Foo < T extends string , U extends T > = [ T , U ] ;
94
+ type Bar < T > = T extends Foo < infer X , infer Y > ? Foo < X , Y > : never ;
95
+
96
+ type T90 = Bar < [ string , string ] > ; // [string, string]
97
+ type T91 = Bar < [ string , "a" ] > ; // [string, "a"]
98
+ type T92 = Bar < [ string , "a" ] & { x : string } > ; // [string, "a"]
99
+ type T93 = Bar < [ "a" , string ] > ; // never
100
+ type T94 = Bar < [ number , number ] > ; // never
101
+
93
102
// Example from #21496
94
103
95
104
type JsonifiedObject < T extends object > = { [ K in keyof T ] : Jsonified < T [ K ] > } ;
@@ -150,3 +159,11 @@ interface test {
150
159
151
160
type T80 = MatchingKeys < test , void > ;
152
161
type T81 = VoidKeys < test > ;
162
+
163
+ // Repro from #22221
164
+
165
+ type MustBeString < T extends string > = T ;
166
+ type EnsureIsString < T > = T extends MustBeString < infer U > ? U : never ;
167
+
168
+ type Test1 = EnsureIsString < "hello" > ; // "hello"
169
+ type Test2 = EnsureIsString < 42 > ; // never
0 commit comments