TypeScript 的类型系统是图灵完备的,掌握高级类型模式可以让我们写出更安全、更具表达力的代码。
条件类型
条件类型允许我们根据类型关系来选择类型:
type IsString<T> = T extends string ? true : false;
映射类型
映射类型可以基于已有类型创建新类型:
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
模板字面量类型
TypeScript 4.1 引入的模板字面量类型让字符串操作也能获得类型安全:
type EventName<T extends string> = `on${Capitalize<T>}`;
递归类型
递归类型可以处理嵌套数据结构:
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
实践建议
- 不要为了炫技而过度使用复杂类型
- 优先使用简单直观的类型定义
- 复杂类型加上注释说明用途
- 善用类型工具库如 type-fest