用途
该技能用于在读取或编辑任何 .ts 或 .tsx 文件时,应用一套 TypeScript 最佳实践。它要求先应用 cursor-principle-type-system-discipline 技能,再遵循下列规则。
主要能力
- 可辨识联合:用 kind 字面量判别式建模变体,使不可能的状态无法被表示,避免可选字段包。
- 品牌类型:用 & { readonly __brand: "X" } 为原始类型打上品牌,防止混用,并在边界处一次性校验。
- 构造式建模:让非法值无法被构造,例如用 [T, ...T[]] 表示非空、[T, T][] 表示偶数长度、用起点加时长表示范围。这不是运行时守卫,也不是对细化类型的期望。
- 最简单的全类型:只要对 T[] 的每个操作都保持全函数,就保留 T[];仅当宽松类型迫使使用 !、类型断言或“不应发生”的抛出时,才强化为 NonEmpty<T>。
- unknown 优于 any:外部数据是 unknown。
- schema 先于守卫:在手工逐属性编写类型守卫之前,使用仓库的运行时 schema 库,并从 schema 推断类型,例如 z.infer。
- 禁止 as 断言:每个 as 都是潜在的运行时崩溃,只在验证之后才做断言。
- 收窄层级:判别式 switch > in 运算符 > typeof/instanceof > 用户定义类型守卫 > as。
- 类型守卫:必须验证其声明。说谎的守卫比 as 更糟,因为 bug 藏在一个声称安全的名称后面。命名用 isX 或 hasX。
- 穷尽性:在 default 分支内联 const _exhaustive: never = x;,这样新增变体时编译器会报错。
- satisfies 优于 as:在不拓宽字面量类型的前提下验证值。
- 边界校验:在数据进入处解析为具名领域类型。Record<string, unknown>(无论怎么拼写)止步于该解析。内部信任类型。参见 cursor-principle-boundary-discipline 技能。
- 从 schema 派生类型:在声明新接口之前,先考虑 Pick/Omit/Parameters/ReturnType/Awaited/typeof。
- 对象参数:传递对象而非位置参数,使参数顺序自文档化。在热路径(逐帧渲染、分词器、解析器)上跳过。
- 真实测试:不要 mock 你能运行的东西。优先使用框架的真实测试原语并做泄漏/可释放检查,在运行中的构建里验证 UI。只 mock 本地无法运行的部分。
- 结构化遥测:优先使用结构化日志诊断,上下文足以从 id 调试。发布代码中不要有 console.log。
使用方式
在读取或编辑任何 .ts 或 .tsx 文件时应用该技能。先应用 cursor-principle-type-system-discipline 技能,再按上述规则执行。示例见 references/patterns.md。
适用场景
适用于 TypeScript 项目的日常开发,尤其是需要强化类型安全、减少运行时错误、规范类型守卫与边界校验的场景。
限制
资料未提供关于收费、价格、平台支持、具体效果或额外使用步骤的信息。