TypeScript 类型体操:从入门到实用
不讲概念讲实战,用真实业务场景讲清楚条件类型、映射类型、模板字面量的用法。
TypeScript 的类型系统是图灵完备的,这意味着可以用类型表达复杂逻辑。本文不堆概念,直接上实际遇到的场景。
条件类型:动态返回类型
场景:一个函数根据参数类型返回不同结构,如何让 TypeScript 正确推断返回值?
type Extract<T, U> = T extends U ? T : never;
function getValues<T, K extends keyof T>(obj: T, keys: K[]): T[K][] {
return keys.map(k => obj[k]);
}
映射类型:批量变换属性
将一个类型的所有属性变为可选,或者将所有属性值包装成 Promise:
type Promisify<T> = {
[K in keyof T]: Promise<T[K]>;
};
模板字面量类型
用类型层面的字符串拼接来生成事件名、CSS 类名等有规律的字符串集合,比枚举更灵活。
实用原则
能用简单类型解决的,不要用复杂类型。类型体操的目标是让 IDE 帮你找 bug,而不是炫技。