ข้ามไปเนื้อหาหลัก

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