|
1 |
| -tests/cases/conformance/types/literal/templateLiteralTypes4.ts(128,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'. |
2 |
| -tests/cases/conformance/types/literal/templateLiteralTypes4.ts(132,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'. |
| 1 | +tests/cases/conformance/types/literal/templateLiteralTypes4.ts(120,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'. |
| 2 | +tests/cases/conformance/types/literal/templateLiteralTypes4.ts(124,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'. |
3 | 3 |
|
4 | 4 |
|
5 | 5 | ==== tests/cases/conformance/types/literal/templateLiteralTypes4.ts (2 errors) ====
|
6 |
| - type Is<T extends U, U> = T; |
7 |
| - |
8 |
| - type T0 = "100" extends `${Is<infer N, number>}` ? N : never; // 100 |
9 |
| - type T1 = "-100" extends `${Is<infer N, number>}` ? N : never; // -100 |
10 |
| - type T2 = "1.1" extends `${Is<infer N, number>}` ? N : never; // 1.1 |
11 |
| - type T3 = "8e-11" extends `${Is<infer N, number>}` ? N : never; // 8e-11 (0.00000000008) |
12 |
| - type T4 = "0x10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable) |
13 |
| - type T5 = "0o10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable) |
14 |
| - type T6 = "0b10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable) |
15 |
| - type T7 = "10e2" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable) |
16 |
| - type T8 = "abcd" extends `${Is<infer N, number>}` ? N : never; // never |
17 |
| - |
18 |
| - type T10 = "100" extends `${Is<infer N, bigint>}` ? N : never; // 100n |
19 |
| - type T11 = "-100" extends `${Is<infer N, bigint>}` ? N : never; // -100n |
20 |
| - type T12 = "0x10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable) |
21 |
| - type T13 = "0o10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable) |
22 |
| - type T14 = "0b10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable) |
23 |
| - type T15 = "1.1" extends `${Is<infer N, bigint>}` ? N : never; // never |
24 |
| - type T16 = "10e2" extends `${Is<infer N, bigint>}` ? N : never; // never |
25 |
| - type T17 = "abcd" extends `${Is<infer N, bigint>}` ? N : never; // never |
26 |
| - |
27 |
| - type T20 = "true" extends `${Is<infer T, boolean>}` ? T : never; // true |
28 |
| - type T21 = "false" extends `${Is<infer T, boolean>}` ? T : never; // false |
29 |
| - type T22 = "abcd" extends `${Is<infer T, boolean>}` ? T : never; // never |
30 |
| - |
31 |
| - type T30 = "null" extends `${Is<infer T, null>}` ? T : never; // null |
32 |
| - type T31 = "abcd" extends `${Is<infer T, null>}` ? T : never; // never |
33 |
| - |
34 |
| - type T40 = "undefined" extends `${Is<infer T, undefined>}` ? T : never; // undefined |
35 |
| - type T41 = "abcd" extends `${Is<infer T, undefined>}` ? T : never; // never |
36 |
| - |
37 |
| - type T500 = "100" extends `${Is<infer T, string | number | bigint>}` ? T : never; // "100" |
38 |
| - type T501 = "100" extends `${Is<infer T, number | bigint>}` ? T : never; // 100 |
39 |
| - type T502 = "100" extends `${Is<infer T, bigint>}` ? T : never; // 100n |
40 |
| - type T503 = "100" extends `${Is<infer T, "100" | number>}` ? T : never; // "100" |
41 |
| - type T504 = "100" extends `${Is<infer T, "101" | number>}` ? T : never; // 100 |
42 |
| - |
43 |
| - type T510 = "1.1" extends `${Is<infer T, string | number | bigint>}` ? T : never; // "1.1" |
44 |
| - type T511 = "1.1" extends `${Is<infer T, number | bigint>}` ? T : never; // 1.1 |
45 |
| - type T512 = "1.1" extends `${Is<infer T, bigint>}` ? T : never; // never |
46 |
| - |
47 |
| - type T520 = "true" extends `${Is<infer T, string | boolean>}` ? T : never; // "true" |
48 |
| - type T521 = "true" extends `${Is<infer T, boolean>}` ? T : never; // true |
49 |
| - |
50 |
| - type T530 = "false" extends `${Is<infer T, string | boolean>}` ? T : never; // "false" |
51 |
| - type T531 = "false" extends `${Is<infer T, boolean>}` ? T : never; // false |
52 |
| - |
53 |
| - type T540 = "null" extends `${Is<infer T, string | null>}` ? T : never; // "null" |
54 |
| - type T541 = "null" extends `${Is<infer T, string | null>}` ? T : never; // null |
55 |
| - |
56 |
| - type T550 = "undefined" extends `${Is<infer T, string | undefined>}` ? T : never; // "undefined" |
57 |
| - type T551 = "undefined" extends `${Is<infer T, undefined>}` ? T : never; // undefined |
58 |
| - |
59 |
| - type T560 = "100000000000000000000000" extends `${Is<infer T, number | bigint>}` ? T : never; // 100000000000000000000000n |
60 |
| - type T561 = "100000000000000000000000" extends `${Is<infer T, number>}` ? T : never; // number |
| 6 | + type T0 = "100" extends `${infer N extends number}` ? N : never; // 100 |
| 7 | + type T1 = "-100" extends `${infer N extends number}` ? N : never; // -100 |
| 8 | + type T2 = "1.1" extends `${infer N extends number}` ? N : never; // 1.1 |
| 9 | + type T3 = "8e-11" extends `${infer N extends number}` ? N : never; // 8e-11 (0.00000000008) |
| 10 | + type T4 = "0x10" extends `${infer N extends number}` ? N : never; // number (not round-trippable) |
| 11 | + type T5 = "0o10" extends `${infer N extends number}` ? N : never; // number (not round-trippable) |
| 12 | + type T6 = "0b10" extends `${infer N extends number}` ? N : never; // number (not round-trippable) |
| 13 | + type T7 = "10e2" extends `${infer N extends number}` ? N : never; // number (not round-trippable) |
| 14 | + type T8 = "abcd" extends `${infer N extends number}` ? N : never; // never |
| 15 | + |
| 16 | + type T10 = "100" extends `${infer N extends bigint}` ? N : never; // 100n |
| 17 | + type T11 = "-100" extends `${infer N extends bigint}` ? N : never; // -100n |
| 18 | + type T12 = "0x10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable) |
| 19 | + type T13 = "0o10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable) |
| 20 | + type T14 = "0b10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable) |
| 21 | + type T15 = "1.1" extends `${infer N extends bigint}` ? N : never; // never |
| 22 | + type T16 = "10e2" extends `${infer N extends bigint}` ? N : never; // never |
| 23 | + type T17 = "abcd" extends `${infer N extends bigint}` ? N : never; // never |
| 24 | + |
| 25 | + type T20 = "true" extends `${infer T extends boolean}` ? T : never; // true |
| 26 | + type T21 = "false" extends `${infer T extends boolean}` ? T : never; // false |
| 27 | + type T22 = "abcd" extends `${infer T extends boolean}` ? T : never; // never |
| 28 | + |
| 29 | + type T30 = "null" extends `${infer T extends null}` ? T : never; // null |
| 30 | + type T31 = "abcd" extends `${infer T extends null}` ? T : never; // never |
| 31 | + |
| 32 | + type T40 = "undefined" extends `${infer T extends undefined}` ? T : never; // undefined |
| 33 | + type T41 = "abcd" extends `${infer T extends undefined}` ? T : never; // never |
| 34 | + |
| 35 | + type T500 = "100" extends `${infer T extends string | number | bigint}` ? T : never; // "100" |
| 36 | + type T501 = "100" extends `${infer T extends number | bigint}` ? T : never; // 100 |
| 37 | + type T502 = "100" extends `${infer T extends bigint}` ? T : never; // 100n |
| 38 | + type T503 = "100" extends `${infer T extends "100" | number}` ? T : never; // "100" |
| 39 | + type T504 = "100" extends `${infer T extends "101" | number}` ? T : never; // 100 |
| 40 | + |
| 41 | + type T510 = "1.1" extends `${infer T extends string | number | bigint}` ? T : never; // "1.1" |
| 42 | + type T511 = "1.1" extends `${infer T extends number | bigint}` ? T : never; // 1.1 |
| 43 | + type T512 = "1.1" extends `${infer T extends bigint}` ? T : never; // never |
| 44 | + |
| 45 | + type T520 = "true" extends `${infer T extends string | boolean}` ? T : never; // "true" |
| 46 | + type T521 = "true" extends `${infer T extends boolean}` ? T : never; // true |
| 47 | + |
| 48 | + type T530 = "false" extends `${infer T extends string | boolean}` ? T : never; // "false" |
| 49 | + type T531 = "false" extends `${infer T extends boolean}` ? T : never; // false |
| 50 | + |
| 51 | + type T540 = "null" extends `${infer T extends string | null}` ? T : never; // "null" |
| 52 | + type T541 = "null" extends `${infer T extends string | null}` ? T : never; // null |
| 53 | + |
| 54 | + type T550 = "undefined" extends `${infer T extends string | undefined}` ? T : never; // "undefined" |
| 55 | + type T551 = "undefined" extends `${infer T extends undefined}` ? T : never; // undefined |
| 56 | + |
| 57 | + type T560 = "100000000000000000000000" extends `${infer T extends number | bigint}` ? T : never; // 100000000000000000000000n |
| 58 | + type T561 = "100000000000000000000000" extends `${infer T extends number}` ? T : never; // number |
61 | 59 |
|
62 | 60 | type ExtractPrimitives<T extends string> =
|
63 | 61 | | T
|
64 |
| - | (T extends `${Is<infer U, number>}` ? U : never) |
65 |
| - | (T extends `${Is<infer U, bigint>}` ? U : never) |
66 |
| - | (T extends `${Is<infer U, boolean | null | undefined>}` ? U : never) |
| 62 | + | (T extends `${infer U extends number}` ? U : never) |
| 63 | + | (T extends `${infer U extends bigint}` ? U : never) |
| 64 | + | (T extends `${infer U extends boolean | null | undefined}` ? U : never) |
67 | 65 | ;
|
68 | 66 |
|
69 |
| - // Type writer doesn't show the union that is produced, so we use a helper type to verify constraints |
70 |
| - type T570 = ExtractPrimitives<"100">; |
71 |
| - type CheckT570 = Is<"100" | 100 | 100n, T570>; |
| 67 | + type T570 = ExtractPrimitives<"100">; // "100" | 100 | 100n |
| 68 | + type T571 = ExtractPrimitives<"1.1">; // "1.1" | 1.1 |
| 69 | + type T572 = ExtractPrimitives<"true">; // "true" | true |
72 | 70 |
|
73 |
| - type T571 = ExtractPrimitives<"1.1">; |
74 |
| - type CheckT571 = Is<"1.1" | 1.1, T571>; |
75 |
| - |
76 |
| - type T572 = ExtractPrimitives<"true">; |
77 |
| - type CheckT572 = Is<"true" | true, T572>; |
78 |
| - |
79 |
| - type NumberFor<S extends string> = S extends `${Is<infer N, number>}` ? N : never; |
| 71 | + type NumberFor<S extends string> = S extends `${infer N extends number}` ? N : never; |
80 | 72 | type T60 = NumberFor<"100">; // 100
|
81 | 73 | type T61 = NumberFor<any>; // never
|
82 | 74 | type T62 = NumberFor<never>; // never
|
|
0 commit comments