用途
本技能适用于 TypeScript 6.0+ 类型系统特性、类型安全 API、复杂领域模型、类型推断以及编译期保证。它不覆盖基础语法、框架特定模式以及运行时校验(运行时校验请单独使用 Zod)。
前提假设
- 以文件夹主版本跟踪 package.json 中的 typescript(本仓库为 @typescript/typescript6 ^6),而非 npm view typescript(可能已是 7)。
- 6.0 是最后一个基于 JavaScript 的编译器;7.0 为原生(Go)实现。@typescript/native 可能位于 tsc 旁边,但它不是本技能的主版本。
- 启用严格模式("strict": true)。
- 目标为 ES2020+(6.0 默认趋势偏向 esnext / es2025)。
- 6.0 中废弃的选项可通过 "ignoreDeprecations": "6.0" 忽略,直到 7.0 移除它们。更推荐修复废弃项,参考:https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/
原则
- 使用条件类型根据条件进行类型选择。
- 使用映射类型对对象类型进行系统性转换。
- 使用类型守卫(value is Type)进行运行时检查并实现类型收窄。
- 使用可辨识联合构建类型安全的状态机,并支持穷尽性检查。
- 使用品牌类型防止原始类型混用。
- 优先使用 unknown 而非 any 以保证类型安全。
- 优先使用类型守卫而非类型断言(as Type)。
- 保持类型可组合且浅层(避免深层嵌套)。
- 将不可变数据结构标记为 readonly。
约束
必须(MUST):
- 启用严格模式(tsconfig.json 中 "strict": true)。
- 对无类型值使用 unknown 而非 any。
- 尽可能使用类型守卫(value is Type)而非类型断言。
应当(SHOULD):
- 联合/工具类型使用 type,对象形状使用 interface。
- 保持类型可组合且浅层。
- 将不可变数据结构标记为 readonly。
- 使用品牌类型防止原始类型混用。
- 在采用 TypeScript 7 原生版之前先处理 6.0 废弃项。
避免(AVOID):
- 使用 any(改用 unknown 配合类型守卫)。
- 未经校验的类型断言。
- 过度使用泛型(仅在类型确实变化时使用)。
- 深层类型嵌套(编译慢、难调试)。
- 导入断言(assert { type: ... });改用导入属性。
交互
- 与 zod 配合,实现带类型推断的运行时校验。
- 与 next 互补,用于类型安全的 API 路由。
- 与 fastify 互补,用于类型安全的路由 schema。
模式
映射类型
系统性地转换对象类型:
type Partial<T> = { [P in keyof T]?: T[P] } type Readonly<T> = { readonly [P in keyof T]: T[P] } type Pick<T, K extends keyof T> = { [P in K]: T[P] }
类型守卫
运行时类型检查并实现类型收窄:
function isString(value: unknown): value is string { return typeof value === 'string' }
function isSuccess(result: Result): result is Success { return result.status === 'success' }
品牌类型
创建名义类型以保证类型安全:
type UserId = string & { readonly __brand: 'UserId' } type PostId = string & { readonly __brand: 'PostId' }
function createUserId(id: string): UserId { return id as UserId }
可辨识联合
类型安全的状态机,支持穷尽性检查:
type LoadingState = | { status: 'idle' } | { status: 'loading' } | { status: 'success'; data: string[] } | { status: 'error'; error: Error }
参考
- 条件类型 - 根据条件进行类型选择
- 高级泛型 - 泛型约束与推断模式
- 可辨识联合 - 类型安全的状态机
资源
- Announcing TypeScript 6.0
- TypeScript Handbook
- Type Challenges