TypeScript Conditional Types — T extends U ? X : Y
Conditional types เลือก type ตามเงื่อนไข — syntax คล้าย ternary แต่ทำงานใน type system
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false
Distributive behavior — ถ้า T เป็น union, conditional type กระจายไปแต่ละ member:
type NonNullable<T> = T extends null | undefined ? never : T;
type C = NonNullable<string | null | undefined>; // string
infer — สกัด type ออกจาก pattern:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function greet(): string { return 'hi'; }
type G = ReturnType<typeof greet>; // string
infer ใช้ได้เฉพาะใน conditional type ด้าน extends — ใช้ดึง element type จาก array, parameter type จาก function หรือ promise resolved type