Skip to content
Prev Previous commit
Next Next commit
Switch tests to use infer..extends
  • Loading branch information
rbuckton committed May 9, 2022
commit 06685cb060ecb21edb3f3dcd97ea5ce08e97e38f
132 changes: 62 additions & 70 deletions tests/baselines/reference/templateLiteralTypes4.errors.txt
Original file line number Diff line number Diff line change
@@ -1,82 +1,74 @@
tests/cases/conformance/types/literal/templateLiteralTypes4.ts(128,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'.
tests/cases/conformance/types/literal/templateLiteralTypes4.ts(132,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 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'.
tests/cases/conformance/types/literal/templateLiteralTypes4.ts(124,12): error TS2345: Argument of type '2' is not assignable to parameter of type '0 | 1'.


==== tests/cases/conformance/types/literal/templateLiteralTypes4.ts (2 errors) ====
type Is<T extends U, U> = T;

type T0 = "100" extends `${Is<infer N, number>}` ? N : never; // 100
type T1 = "-100" extends `${Is<infer N, number>}` ? N : never; // -100
type T2 = "1.1" extends `${Is<infer N, number>}` ? N : never; // 1.1
type T3 = "8e-11" extends `${Is<infer N, number>}` ? N : never; // 8e-11 (0.00000000008)
type T4 = "0x10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable)
type T5 = "0o10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable)
type T6 = "0b10" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable)
type T7 = "10e2" extends `${Is<infer N, number>}` ? N : never; // number (not round-trippable)
type T8 = "abcd" extends `${Is<infer N, number>}` ? N : never; // never

type T10 = "100" extends `${Is<infer N, bigint>}` ? N : never; // 100n
type T11 = "-100" extends `${Is<infer N, bigint>}` ? N : never; // -100n
type T12 = "0x10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable)
type T13 = "0o10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable)
type T14 = "0b10" extends `${Is<infer N, bigint>}` ? N : never; // bigint (not round-trippable)
type T15 = "1.1" extends `${Is<infer N, bigint>}` ? N : never; // never
type T16 = "10e2" extends `${Is<infer N, bigint>}` ? N : never; // never
type T17 = "abcd" extends `${Is<infer N, bigint>}` ? N : never; // never

type T20 = "true" extends `${Is<infer T, boolean>}` ? T : never; // true
type T21 = "false" extends `${Is<infer T, boolean>}` ? T : never; // false
type T22 = "abcd" extends `${Is<infer T, boolean>}` ? T : never; // never

type T30 = "null" extends `${Is<infer T, null>}` ? T : never; // null
type T31 = "abcd" extends `${Is<infer T, null>}` ? T : never; // never

type T40 = "undefined" extends `${Is<infer T, undefined>}` ? T : never; // undefined
type T41 = "abcd" extends `${Is<infer T, undefined>}` ? T : never; // never

type T500 = "100" extends `${Is<infer T, string | number | bigint>}` ? T : never; // "100"
type T501 = "100" extends `${Is<infer T, number | bigint>}` ? T : never; // 100
type T502 = "100" extends `${Is<infer T, bigint>}` ? T : never; // 100n
type T503 = "100" extends `${Is<infer T, "100" | number>}` ? T : never; // "100"
type T504 = "100" extends `${Is<infer T, "101" | number>}` ? T : never; // 100

type T510 = "1.1" extends `${Is<infer T, string | number | bigint>}` ? T : never; // "1.1"
type T511 = "1.1" extends `${Is<infer T, number | bigint>}` ? T : never; // 1.1
type T512 = "1.1" extends `${Is<infer T, bigint>}` ? T : never; // never

type T520 = "true" extends `${Is<infer T, string | boolean>}` ? T : never; // "true"
type T521 = "true" extends `${Is<infer T, boolean>}` ? T : never; // true

type T530 = "false" extends `${Is<infer T, string | boolean>}` ? T : never; // "false"
type T531 = "false" extends `${Is<infer T, boolean>}` ? T : never; // false

type T540 = "null" extends `${Is<infer T, string | null>}` ? T : never; // "null"
type T541 = "null" extends `${Is<infer T, string | null>}` ? T : never; // null

type T550 = "undefined" extends `${Is<infer T, string | undefined>}` ? T : never; // "undefined"
type T551 = "undefined" extends `${Is<infer T, undefined>}` ? T : never; // undefined

type T560 = "100000000000000000000000" extends `${Is<infer T, number | bigint>}` ? T : never; // 100000000000000000000000n
type T561 = "100000000000000000000000" extends `${Is<infer T, number>}` ? T : never; // number
type T0 = "100" extends `${infer N extends number}` ? N : never; // 100
type T1 = "-100" extends `${infer N extends number}` ? N : never; // -100
type T2 = "1.1" extends `${infer N extends number}` ? N : never; // 1.1
type T3 = "8e-11" extends `${infer N extends number}` ? N : never; // 8e-11 (0.00000000008)
type T4 = "0x10" extends `${infer N extends number}` ? N : never; // number (not round-trippable)
type T5 = "0o10" extends `${infer N extends number}` ? N : never; // number (not round-trippable)
type T6 = "0b10" extends `${infer N extends number}` ? N : never; // number (not round-trippable)
type T7 = "10e2" extends `${infer N extends number}` ? N : never; // number (not round-trippable)
type T8 = "abcd" extends `${infer N extends number}` ? N : never; // never

type T10 = "100" extends `${infer N extends bigint}` ? N : never; // 100n
type T11 = "-100" extends `${infer N extends bigint}` ? N : never; // -100n
type T12 = "0x10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable)
type T13 = "0o10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable)
type T14 = "0b10" extends `${infer N extends bigint}` ? N : never; // bigint (not round-trippable)
type T15 = "1.1" extends `${infer N extends bigint}` ? N : never; // never
type T16 = "10e2" extends `${infer N extends bigint}` ? N : never; // never
type T17 = "abcd" extends `${infer N extends bigint}` ? N : never; // never

type T20 = "true" extends `${infer T extends boolean}` ? T : never; // true
type T21 = "false" extends `${infer T extends boolean}` ? T : never; // false
type T22 = "abcd" extends `${infer T extends boolean}` ? T : never; // never

type T30 = "null" extends `${infer T extends null}` ? T : never; // null
type T31 = "abcd" extends `${infer T extends null}` ? T : never; // never

type T40 = "undefined" extends `${infer T extends undefined}` ? T : never; // undefined
type T41 = "abcd" extends `${infer T extends undefined}` ? T : never; // never

type T500 = "100" extends `${infer T extends string | number | bigint}` ? T : never; // "100"
type T501 = "100" extends `${infer T extends number | bigint}` ? T : never; // 100
type T502 = "100" extends `${infer T extends bigint}` ? T : never; // 100n
type T503 = "100" extends `${infer T extends "100" | number}` ? T : never; // "100"
type T504 = "100" extends `${infer T extends "101" | number}` ? T : never; // 100

type T510 = "1.1" extends `${infer T extends string | number | bigint}` ? T : never; // "1.1"
type T511 = "1.1" extends `${infer T extends number | bigint}` ? T : never; // 1.1
type T512 = "1.1" extends `${infer T extends bigint}` ? T : never; // never

type T520 = "true" extends `${infer T extends string | boolean}` ? T : never; // "true"
type T521 = "true" extends `${infer T extends boolean}` ? T : never; // true

type T530 = "false" extends `${infer T extends string | boolean}` ? T : never; // "false"
type T531 = "false" extends `${infer T extends boolean}` ? T : never; // false

type T540 = "null" extends `${infer T extends string | null}` ? T : never; // "null"
type T541 = "null" extends `${infer T extends string | null}` ? T : never; // null

type T550 = "undefined" extends `${infer T extends string | undefined}` ? T : never; // "undefined"
type T551 = "undefined" extends `${infer T extends undefined}` ? T : never; // undefined

type T560 = "100000000000000000000000" extends `${infer T extends number | bigint}` ? T : never; // 100000000000000000000000n
type T561 = "100000000000000000000000" extends `${infer T extends number}` ? T : never; // number

type ExtractPrimitives<T extends string> =
| T
| (T extends `${Is<infer U, number>}` ? U : never)
| (T extends `${Is<infer U, bigint>}` ? U : never)
| (T extends `${Is<infer U, boolean | null | undefined>}` ? U : never)
| (T extends `${infer U extends number}` ? U : never)
| (T extends `${infer U extends bigint}` ? U : never)
| (T extends `${infer U extends boolean | null | undefined}` ? U : never)
;

// Type writer doesn't show the union that is produced, so we use a helper type to verify constraints
type T570 = ExtractPrimitives<"100">;
type CheckT570 = Is<"100" | 100 | 100n, T570>;
type T570 = ExtractPrimitives<"100">; // "100" | 100 | 100n
type T571 = ExtractPrimitives<"1.1">; // "1.1" | 1.1
type T572 = ExtractPrimitives<"true">; // "true" | true

type T571 = ExtractPrimitives<"1.1">;
type CheckT571 = Is<"1.1" | 1.1, T571>;

type T572 = ExtractPrimitives<"true">;
type CheckT572 = Is<"true" | true, T572>;

type NumberFor<S extends string> = S extends `${Is<infer N, number>}` ? N : never;
type NumberFor<S extends string> = S extends `${infer N extends number}` ? N : never;
type T60 = NumberFor<"100">; // 100
type T61 = NumberFor<any>; // never
type T62 = NumberFor<never>; // never
Expand Down
Loading