关于 typescript-v6
面向 TypeScript 6.0+ 类型系统特性与类型安全 API 设计的指南。重点包括类型推导、领域模型和编译期保证,不涉及基础语法或运行时校验。
主要功能
- 01条件类型与映射类型
- 02类型守卫与类型收窄
- 03可辨识联合类型
- 04用品牌类型区分原始值
- 05严格且可组合的类型实践
适用场景
- 01建模类型安全的状态机
- 02系统化转换对象类型
- 03避免不同标识符意外混用
- 04安全收窄 unknown 值的类型
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ blockmatic/ basilic-skills --skill typescript-v6安装后在 Claude Code 中输入/typescript-v6确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-generics.mdconditional-types.mddiscriminated-unions.md详细介绍
技能:typescript
范围
- 适用范围:TypeScript 6.0+ 类型系统功能、类型安全 API、复杂领域模型、类型推断、编译时保证
- 不涵盖:基础语法、特定框架模式、运行时验证(请另行使用 Zod)
假设
- 主要版本以文件夹中的
package.jsontypescript为准(本仓库:@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
约束
必须
- 启用严格模式(在
tsconfig.json中设置"strict": true) - 对无类型值使用
unknown,而非any - 尽可能使用类型守卫(
value is Type),而非类型断言
应当
- 联合类型和工具类型使用
type,对象结构使用interface - 保持类型可组合且浅层
- 将不可变数据结构标记为
readonly - 使用品牌类型,防止原始类型混用
- 在采用 TypeScript 7 原生实现之前处理 6.0 的弃用项
避免
- 使用
any(请使用unknown和类型守卫) - 未经验证就使用类型断言
- 过度使用泛型(仅在类型确实会变化时使用)
- 深层类型嵌套(编译缓慢且难以调试)
- 导入断言(
assert { type: ... });请使用with导入属性
交互
模式
映射类型
系统性地转换对象类型:
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 }
参考资料
资源
评论
支持 Markdown