Advanced Type Engineering

Preview — 3 of 10 questions

What is the result of IsString<number>?

javascript
type IsString<T> = T extends string ? true : false;

type A = IsString<string>;  // ?
type B = IsString<number>;  // ?
type C = IsString<"hello">; // ?
AA = true, B = true, C = false
BAll three are boolean
CA = string, B = number, C = "hello"
DA = true, B = false, C = true

What does infer do in conditional types?

javascript
type UnpackPromise<T> = T extends Promise<infer U> ? U : T;

type A = UnpackPromise<Promise<string>>;  // ?
type B = UnpackPromise<number>;            // ?
AA = Promise<string>, B = number
BA = string, B = never
CA = string, B = number
DA = unknown, B = number

What is the result of D?

javascript
type Nullable<T> = T extends any ? T | null : never;
type D = Nullable<string | number>;
Astring | number | null
B(string | null) | (number | null) — which simplifies to string | number | null
Cnull
D(string | number) | null — same as A but different distribution

Sign up free to play

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