Conditional Types & Infer

Preview — 3 of 10 questions

What is the exact result?

javascript
type ToArray<T> = T extends any ? T[] : never;

type A = ToArray<string>;
type B = ToArray<string | number>;
type C = ToArray<never>;
AA = string[], B = string[] | number[], C = never
BA = string[], B = (string | number)[], C = never
CA = string[], B = string[] | number[], C = never[]
DAll three are never

What does this compute?

javascript
type Flatten<T> =
  T extends Array<infer U>
    ? Flatten<U>
    : T extends Promise<infer V>
    ? Flatten<V>
    : T;

type A = Flatten<number[][][]>;
type B = Flatten<Promise<Promise<string>>>;
type C = Flatten<Promise<number[]>>;
AA = number[], B = Promise<string>, C = number[]
BA = number, B = string, C = number[]
CA = number, B = string, C = number
DAll three are never

What does infer produce here?

javascript
type FirstAndLast<T extends readonly any[]> =
  T extends readonly [infer First, ...any[], infer Last]
    ? [First, Last]
    : T extends readonly [infer Only]
    ? [Only, Only]
    : never;

type A = FirstAndLast<[1, 2, 3, 4, 5]>;
type B = FirstAndLast<['hello']>;
type C = FirstAndLast<[]>;
AA = [1, 5], B = ['hello', 'hello'], C = never
BA = [1, 2, 3, 4, 5], B = ['hello'], C = []
CA = [1, 5], B = never, C = never
DA = never, B = never, C = never

Sign up free to play

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