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;