Advanced Type Engineering — Series 3

Preview — 3 of 10 questions

javascript
type ToNum<T> = T extends `${infer N extends number}` ? N : never;

type A = ToNum<"42">;
type B = ToNum<"abc">;
AA is string, B is string
BA is 42 (a numeric literal type), B is never
CA is number, B is number
DCompile-time error — infer may not carry an extends clause

javascript
type First<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never;

type A = First<(a: string, b: number) => void>;
type B = First<() => void>;
AA is string, B is never
BA is [string, number], B is []
CCompile-time error — infer cannot appear in a parameter position
DA is string, B is unknown

javascript
type Box<T> = T extends unknown ? T[] : never;
type Guarded<T> = [T] extends [unknown] ? T[] : never;

type A = Box<string | number>;
type B = Box<never>;
type C = Guarded<never>;
AA is (string | number)[], B is never[], C is never[]
BA is string[] | number[], B is never[], C is never[]
CA is string[] | number[], B is never, C is never[]
DAll three are never — T extends unknown is always false for a type parameter

Sign up free to play

Answer all 10 questions (7 more), see explanations for every answer, and track your score.