SuperAPI AI 工具集

typescript-best-practices

编程与开发

查看项目

更新于 10-16 02:02

技能介绍

用途

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 项目的日常开发,尤其是涉及类型建模、外部数据边界处理、类型守卫编写、测试策略和日志记录的场合。

限制

资料未提供关于安装命令、平台支持、收费方式或具体工具链的说明。