用途
TypeScript 最佳实践技能用于在阅读或编辑任何 .ts 或 .tsx 文件时,指导开发者遵循一套类型系统纪律。该技能要求先应用 type-system-discipline 原则技能,再按下列规则处理类型设计。
主要能力
- 可辨识联合(Discriminated unions):用
kind字面量判别字段建模变体,使不可能的状态无法被表示,避免使用可选字段的松散结构。 - 品牌类型(Branded types):用
& { readonly __brand: "X" }为原始类型打上品牌,防止混用,并在边界处一次性校验。 - 构造性建模(Constructive modeling):通过类型形状让非法值无法被构造,例如用
[T, ...T[]]表示非空、[T, T][]表示偶数长度、用起点加时长表示范围。这不是运行时守卫,也不是对细化类型的期望。 - 最简单的全类型(Simplest total type):只要对
T[]的每个操作都保持全函数,就保留T[];仅当松散类型迫使使用!、类型转换或“不应发生”的抛出时,才强化为NonEmpty<T>。 - unknown 优于 any:外部数据视为
unknown。 - 先 schema 后守卫(Schemas before guards):在手工编写逐属性类型守卫之前,使用仓库的运行时 schema 库,并从 schema 推断类型,例如
z.infer。 - 禁止 as 断言(No as casts):每个
as都是潜在的运行时崩溃,仅在验证之后才可转换。 - 收窄层级(Narrowing hierarchy):判别式 switch >
in运算符 >typeof/instanceof> 用户定义类型守卫 >as。 - 类型守卫(Type guards):必须验证其声明。说谎的守卫比
as更糟,因为 bug 隐藏在一个声称安全的名称后面。命名应为isX或hasX。 - 穷尽性(Exhaustiveness):在 default 分支内联
const _exhaustive: never = x;,以便新增变体时编译器报错。 - satisfies 优于 as:在不拓宽字面量类型的前提下校验值。
- 边界校验(Boundary validation):在数据进入处解析为具名领域类型。
Record<string, unknown>(无论何种写法)止于该解析处,内部信任类型。参见 boundary-discipline 原则技能。 - 从 schema 派生类型(Schema-derived types):在声明新接口之前,优先使用
Pick/Omit/Parameters/ReturnType/Awaited/typeof。 - 对象参数(Object args):传递对象而非位置参数,使参数顺序自文档化。在热路径(逐帧渲染、分词器、解析器)上可跳过。
- 真实测试(Real tests):不要 mock 可以真实运行的东西。优先使用框架的真实测试原语,配合泄漏/可释放检查,并在运行中的构建里验证 UI。只 mock 本地无法运行的部分。
- 结构化遥测(Structured telemetry):优先使用结构化日志诊断,提供足够上下文以便从 id 调试。发布代码中不得使用
console.log。
使用方式
在阅读或编辑任何 .ts 或 .tsx 文件时应用本技能。先应用 type-system-discipline 原则技能,再按上述规则逐条检查类型设计。示例见 references/patterns.md。
适用场景
适用于 TypeScript 项目的日常开发,尤其是涉及类型建模、外部数据边界处理、类型守卫编写、测试策略和日志记录的场合。
限制
资料未提供关于安装命令、平台支持、收费方式或具体工具链的说明。