关于 typescript-advanced-patterns
面向 TypeScript 5+ 开发者的高级类型模式技能,聚焦类型安全 API、复杂领域模型与编译期保证。它强调严格模式、可组合类型及以类型守卫进行校验。
主要功能
- 01条件类型与映射类型
- 02类型守卫与类型收窄
- 03判别联合与穷尽检查
- 04品牌类型防止原始值混用
- 05优先使用 unknown 保持类型安全
适用场景
- 01设计类型安全 API
- 02建模复杂领域对象
- 03构建类型安全状态机
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ blockmatic/ basilic --skill typescript-advanced-patterns安装后在 Claude Code 中输入/typescript-advanced-patterns确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-generics.mdconditional-types.mddiscriminated-unions.md详细介绍
技能:typescript
范围
- 适用:TypeScript v5+ 高级类型系统功能、类型安全的 API、复杂领域模型、高级类型推断、编译时保证
- 不适用:TypeScript 基础语法、特定框架模式、运行时校验库(请单独使用 Zod)
前提
- TypeScript v5+
- 已启用严格模式(在
tsconfig.json中设置"strict": true) - 目标:ES2020+ 或更高版本
原则
- 使用条件类型,根据条件选择类型
- 使用映射类型,系统地转换对象类型
- 使用类型守卫(
value is Type)进行运行时检查和类型收窄 - 使用可辨识联合,构建支持穷尽性检查的类型安全状态机
- 使用品牌类型,避免基本类型混用
- 为确保类型安全,优先使用
unknown而非any - 优先使用类型守卫,而非类型断言(
as Type) - 保持类型可组合且浅层(避免深层嵌套)
- 将不可变数据结构标记为
readonly
约束
必须
- 启用严格模式(在
tsconfig.json中设置"strict": true) - 对未类型化的值使用
unknown,而非any - 尽可能使用类型守卫(
value is Type),而非类型断言
应当
- 联合类型和工具类型使用
type,对象结构使用interface - 保持类型可组合且浅层
- 将不可变数据结构标记为
readonly - 使用品牌类型,避免基本类型混用
避免
- 使用
any(使用带类型守卫的unknown) - 未经验证就使用类型断言
- 过度使用泛型(仅在类型确实会变化时使用)
- 深层类型嵌套(编译速度慢,难以调试)
关联
模式
映射类型
系统地转换对象类型:
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 }
参考
资源
- TypeScript 手册
- 类型挑战
- ts-toolbelt - 高级类型工具库
评论
支持 Markdown