TypeScript - Conditional Types & infer

Conditional types

type IsString = T extends string ? true : false;

type A = IsString; // true
type B = IsString; // false

Distributivity

type ToArray = T extends any ? T[] : never;
// ToArray -> string[] | number[]

infer

type ReturnTypeOf = T extends (...args: any) => infer R ? R : never;

type R = ReturnTypeOf<() => Promise>; // Promise

Extract tuple parts

type First = T extends [infer H, ...any[]] ? H : never;