Basic Conditional
type IsString<T> = T extends string ? true : false;
type A = IsString<'hello'>; // true
type B = IsString<42>; // falseExtract and Exclude
type EventType = 'click' | 'scroll' | 'mousemove';
// Built-in Extract
type MouseEvents = Extract<EventType, 'click' | 'mousemove'>;
// "click" | "mousemove"
// Built-in Exclude
type NonClickEvents = Exclude<EventType, 'click'>;
// "scroll" | "mousemove"Infer Keyword
// Extract return type
type ReturnOf<T> = T extends (...args: any[]) => infer R ? R : never;
const fn = () => ({ id: 1, name: 'test' });
type Result = ReturnOf<typeof fn>; // { id: number; name: string }
// Extract array element type
type ArrayElement<T> = T extends (infer E)[] ? E : never;
type Item = ArrayElement<string[]>; // string
// Extract Promise value
type Awaited<T> = T extends Promise<infer V> ? V : T;
type Value = Awaited<Promise<number>>; // numberFunction Parameter Types
type FirstParam<T> = T extends (first: infer F, ...args: any[]) => any ? F : never;
type Params = FirstParam<(name: string, age: number) => void>; // string



