Skip to content

Commit 4a7019e

Browse files
committed
tests 'infer' constraint using outer type parameter
1 parent 326389b commit 4a7019e

File tree

4 files changed

+157
-13
lines changed

4 files changed

+157
-13
lines changed

tests/baselines/reference/inferTypesWithExtends1.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,21 @@ type X16<T> = T extends { [P in infer U extends keyof T]: 1; } ? 1 : 0; // ok, p
106106
type X17<T> = T extends { [P in keyof T as infer U extends P ? 1 : 0]: 1; } ? 1 : 0; // ok, parsed as conditional
107107
type X18<T> = T extends { [P in keyof T as infer U extends P]: 1; } ? 1 : 0; // ok, parsed as `infer..extends` (no trailing `?`)
108108

109+
type X19<T extends string | number> = T extends (infer U extends number) ? [T, U] : never;
110+
type X19_T1 = X19<"a">; // never
111+
type X19_T2 = X19<1>; // [1, 1]
112+
type X19_T3 = X19<1 | "a">; // [1, 1]
113+
114+
type X20<T> = T extends (infer U extends number) ? T extends (infer V extends U) ? [T, U, V] : never : never;
115+
type X20_T1 = X20<1 | "a">; // [1, 1, 1]
116+
117+
type X21<T, N extends number> = T extends (infer U extends N) ? [T, U] : never;
118+
type X21_T1 = X21<1, 1>; // [1, 1]
119+
type X21_T2 = X21<1 | "a", 1>; // [1, 1]
120+
type X21_T3 = X21<1 | 2, 1>; // [1, 1]
121+
type X21_T4 = X21<1 | 2, 2 | 3>; // [2, 2]
122+
type X21_T5 = X21<1 | 2, 3>; // never
123+
109124
// from mongoose
110125
type IfEquals<X, Y, A, B> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;
111126

@@ -247,4 +262,16 @@ declare type X17<T> = T extends {
247262
declare type X18<T> = T extends {
248263
[P in keyof T as infer U extends P]: 1;
249264
} ? 1 : 0;
265+
declare type X19<T extends string | number> = T extends (infer U extends number) ? [T, U] : never;
266+
declare type X19_T1 = X19<"a">;
267+
declare type X19_T2 = X19<1>;
268+
declare type X19_T3 = X19<1 | "a">;
269+
declare type X20<T> = T extends (infer U extends number) ? T extends (infer V extends U) ? [T, U, V] : never : never;
270+
declare type X20_T1 = X20<1 | "a">;
271+
declare type X21<T, N extends number> = T extends (infer U extends N) ? [T, U] : never;
272+
declare type X21_T1 = X21<1, 1>;
273+
declare type X21_T2 = X21<1 | "a", 1>;
274+
declare type X21_T3 = X21<1 | 2, 1>;
275+
declare type X21_T4 = X21<1 | 2, 2 | 3>;
276+
declare type X21_T5 = X21<1 | 2, 3>;
250277
declare type IfEquals<X, Y, A, B> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;

tests/baselines/reference/inferTypesWithExtends1.symbols

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -416,19 +416,85 @@ type X18<T> = T extends { [P in keyof T as infer U extends P]: 1; } ? 1 : 0; //
416416
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 105, 48))
417417
>P : Symbol(P, Decl(inferTypesWithExtends1.ts, 105, 27))
418418

419+
type X19<T extends string | number> = T extends (infer U extends number) ? [T, U] : never;
420+
>X19 : Symbol(X19, Decl(inferTypesWithExtends1.ts, 105, 76))
421+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 107, 9))
422+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 107, 9))
423+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 107, 54))
424+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 107, 9))
425+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 107, 54))
426+
427+
type X19_T1 = X19<"a">; // never
428+
>X19_T1 : Symbol(X19_T1, Decl(inferTypesWithExtends1.ts, 107, 90))
429+
>X19 : Symbol(X19, Decl(inferTypesWithExtends1.ts, 105, 76))
430+
431+
type X19_T2 = X19<1>; // [1, 1]
432+
>X19_T2 : Symbol(X19_T2, Decl(inferTypesWithExtends1.ts, 108, 23))
433+
>X19 : Symbol(X19, Decl(inferTypesWithExtends1.ts, 105, 76))
434+
435+
type X19_T3 = X19<1 | "a">; // [1, 1]
436+
>X19_T3 : Symbol(X19_T3, Decl(inferTypesWithExtends1.ts, 109, 21))
437+
>X19 : Symbol(X19, Decl(inferTypesWithExtends1.ts, 105, 76))
438+
439+
type X20<T> = T extends (infer U extends number) ? T extends (infer V extends U) ? [T, U, V] : never : never;
440+
>X20 : Symbol(X20, Decl(inferTypesWithExtends1.ts, 110, 27))
441+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 112, 9))
442+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 112, 9))
443+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 112, 30))
444+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 112, 9))
445+
>V : Symbol(V, Decl(inferTypesWithExtends1.ts, 112, 67))
446+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 112, 30))
447+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 112, 9))
448+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 112, 30))
449+
>V : Symbol(V, Decl(inferTypesWithExtends1.ts, 112, 67))
450+
451+
type X20_T1 = X20<1 | "a">; // [1, 1, 1]
452+
>X20_T1 : Symbol(X20_T1, Decl(inferTypesWithExtends1.ts, 112, 109))
453+
>X20 : Symbol(X20, Decl(inferTypesWithExtends1.ts, 110, 27))
454+
455+
type X21<T, N extends number> = T extends (infer U extends N) ? [T, U] : never;
456+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
457+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 115, 9))
458+
>N : Symbol(N, Decl(inferTypesWithExtends1.ts, 115, 11))
459+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 115, 9))
460+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 115, 48))
461+
>N : Symbol(N, Decl(inferTypesWithExtends1.ts, 115, 11))
462+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 115, 9))
463+
>U : Symbol(U, Decl(inferTypesWithExtends1.ts, 115, 48))
464+
465+
type X21_T1 = X21<1, 1>; // [1, 1]
466+
>X21_T1 : Symbol(X21_T1, Decl(inferTypesWithExtends1.ts, 115, 79))
467+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
468+
469+
type X21_T2 = X21<1 | "a", 1>; // [1, 1]
470+
>X21_T2 : Symbol(X21_T2, Decl(inferTypesWithExtends1.ts, 116, 24))
471+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
472+
473+
type X21_T3 = X21<1 | 2, 1>; // [1, 1]
474+
>X21_T3 : Symbol(X21_T3, Decl(inferTypesWithExtends1.ts, 117, 30))
475+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
476+
477+
type X21_T4 = X21<1 | 2, 2 | 3>; // [2, 2]
478+
>X21_T4 : Symbol(X21_T4, Decl(inferTypesWithExtends1.ts, 118, 28))
479+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
480+
481+
type X21_T5 = X21<1 | 2, 3>; // never
482+
>X21_T5 : Symbol(X21_T5, Decl(inferTypesWithExtends1.ts, 119, 32))
483+
>X21 : Symbol(X21, Decl(inferTypesWithExtends1.ts, 113, 27))
484+
419485
// from mongoose
420486
type IfEquals<X, Y, A, B> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;
421-
>IfEquals : Symbol(IfEquals, Decl(inferTypesWithExtends1.ts, 105, 76))
422-
>X : Symbol(X, Decl(inferTypesWithExtends1.ts, 108, 14))
423-
>Y : Symbol(Y, Decl(inferTypesWithExtends1.ts, 108, 16))
424-
>A : Symbol(A, Decl(inferTypesWithExtends1.ts, 108, 19))
425-
>B : Symbol(B, Decl(inferTypesWithExtends1.ts, 108, 22))
426-
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 108, 30))
427-
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 108, 30))
428-
>X : Symbol(X, Decl(inferTypesWithExtends1.ts, 108, 14))
429-
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 108, 68))
430-
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 108, 68))
431-
>Y : Symbol(Y, Decl(inferTypesWithExtends1.ts, 108, 16))
432-
>A : Symbol(A, Decl(inferTypesWithExtends1.ts, 108, 19))
433-
>B : Symbol(B, Decl(inferTypesWithExtends1.ts, 108, 22))
487+
>IfEquals : Symbol(IfEquals, Decl(inferTypesWithExtends1.ts, 120, 28))
488+
>X : Symbol(X, Decl(inferTypesWithExtends1.ts, 123, 14))
489+
>Y : Symbol(Y, Decl(inferTypesWithExtends1.ts, 123, 16))
490+
>A : Symbol(A, Decl(inferTypesWithExtends1.ts, 123, 19))
491+
>B : Symbol(B, Decl(inferTypesWithExtends1.ts, 123, 22))
492+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 123, 30))
493+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 123, 30))
494+
>X : Symbol(X, Decl(inferTypesWithExtends1.ts, 123, 14))
495+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 123, 68))
496+
>T : Symbol(T, Decl(inferTypesWithExtends1.ts, 123, 68))
497+
>Y : Symbol(Y, Decl(inferTypesWithExtends1.ts, 123, 16))
498+
>A : Symbol(A, Decl(inferTypesWithExtends1.ts, 123, 19))
499+
>B : Symbol(B, Decl(inferTypesWithExtends1.ts, 123, 22))
434500

tests/baselines/reference/inferTypesWithExtends1.types

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,42 @@ type X17<T> = T extends { [P in keyof T as infer U extends P ? 1 : 0]: 1; } ? 1
267267
type X18<T> = T extends { [P in keyof T as infer U extends P]: 1; } ? 1 : 0; // ok, parsed as `infer..extends` (no trailing `?`)
268268
>X18 : X18<T>
269269

270+
type X19<T extends string | number> = T extends (infer U extends number) ? [T, U] : never;
271+
>X19 : X19<T>
272+
273+
type X19_T1 = X19<"a">; // never
274+
>X19_T1 : never
275+
276+
type X19_T2 = X19<1>; // [1, 1]
277+
>X19_T2 : [1, 1]
278+
279+
type X19_T3 = X19<1 | "a">; // [1, 1]
280+
>X19_T3 : [1, 1]
281+
282+
type X20<T> = T extends (infer U extends number) ? T extends (infer V extends U) ? [T, U, V] : never : never;
283+
>X20 : X20<T>
284+
285+
type X20_T1 = X20<1 | "a">; // [1, 1, 1]
286+
>X20_T1 : [1, 1, 1]
287+
288+
type X21<T, N extends number> = T extends (infer U extends N) ? [T, U] : never;
289+
>X21 : X21<T, N>
290+
291+
type X21_T1 = X21<1, 1>; // [1, 1]
292+
>X21_T1 : [1, 1]
293+
294+
type X21_T2 = X21<1 | "a", 1>; // [1, 1]
295+
>X21_T2 : [1, 1]
296+
297+
type X21_T3 = X21<1 | 2, 1>; // [1, 1]
298+
>X21_T3 : [1, 1]
299+
300+
type X21_T4 = X21<1 | 2, 2 | 3>; // [2, 2]
301+
>X21_T4 : [2, 2]
302+
303+
type X21_T5 = X21<1 | 2, 3>; // never
304+
>X21_T5 : never
305+
270306
// from mongoose
271307
type IfEquals<X, Y, A, B> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;
272308
>IfEquals : IfEquals<X, Y, A, B>

tests/cases/conformance/types/conditional/inferTypesWithExtends1.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,20 @@ type X16<T> = T extends { [P in infer U extends keyof T]: 1; } ? 1 : 0; // ok, p
108108
type X17<T> = T extends { [P in keyof T as infer U extends P ? 1 : 0]: 1; } ? 1 : 0; // ok, parsed as conditional
109109
type X18<T> = T extends { [P in keyof T as infer U extends P]: 1; } ? 1 : 0; // ok, parsed as `infer..extends` (no trailing `?`)
110110

111+
type X19<T extends string | number> = T extends (infer U extends number) ? [T, U] : never;
112+
type X19_T1 = X19<"a">; // never
113+
type X19_T2 = X19<1>; // [1, 1]
114+
type X19_T3 = X19<1 | "a">; // [1, 1]
115+
116+
type X20<T> = T extends (infer U extends number) ? T extends (infer V extends U) ? [T, U, V] : never : never;
117+
type X20_T1 = X20<1 | "a">; // [1, 1, 1]
118+
119+
type X21<T, N extends number> = T extends (infer U extends N) ? [T, U] : never;
120+
type X21_T1 = X21<1, 1>; // [1, 1]
121+
type X21_T2 = X21<1 | "a", 1>; // [1, 1]
122+
type X21_T3 = X21<1 | 2, 1>; // [1, 1]
123+
type X21_T4 = X21<1 | 2, 2 | 3>; // [2, 2]
124+
type X21_T5 = X21<1 | 2, 3>; // never
125+
111126
// from mongoose
112127
type IfEquals<X, Y, A, B> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;

0 commit comments

Comments
 (0)