Conditional types: T extends U ? X : Y.
Evaluate tại compile time dựa vào type relationship.
typescript
// Cơ bản
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
// Distributive: tự động phân phối trên union
type NonNullable<T> = T extends null | undefined ? never : T;
type C = NonNullable<string | null | undefined>; // string
// Infer: extract type từ bên trong
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type D = ReturnType<() => number>; // number
// Thực tế: flatten array type
type Flatten<T> = T extends Array<infer Item> ? Item : T;
type E = Flatten<string[]>; // string
type F = Flatten<number>; // numberNền tảng của Exclude, Extract, NonNullable, ReturnType, và nhiều utility types.