SuperAPI AI 工具集

typescript-best-practices

编程与开发

查看项目

更新于 10-15 12:20

技能介绍

TypeScript 最佳实践是一份面向 TypeScript 代码的规范技能(skill),适用场景为阅读或编辑任意 .ts 或 .tsx 文件。使用时应先应用 type-system-discipline 原则技能。

在类型建模方面,该技能主张用判别联合(discriminated unions)为变体建模:以一个 kind 字面量作为判别字段,使不可能的状态无法被表示,而不是使用一堆可选字段。品牌类型(branded types)用 & { readonly __brand: "X" } 标记原始类型,防止同源原始类型被混用,并在边界处一次性完成校验。构造式建模(constructive modeling)强调的是把类型设计成非法值根本无法构造,例如用 [T, ...T[]] 表示非空、用 [T, T][] 表示偶数长度、用起点加时长表示区间;这一做法不是运行时守卫,也不是对细化类型(refinement types)的期待。

在类型的严格程度上,技能提出“最简全域类型”思路:只要对 T[] 的每一个操作都保持全域(total),就保留 T[];只有当松散类型迫使使用非空断言 !、类型断言或“不应发生”的抛出时,才升级为 NonEmpty<T>。

在外部数据与校验方面,外部数据一律视为 unknown,而非 any。在手工编写逐属性类型守卫之前,应优先使用仓库现有的运行时 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>(无论怎样书写)止步于解析处,内部则信任类型,可参见 boundary-discipline 原则技能。在声明新接口之前,应先尝试 Pick/Omit/Parameters/ReturnType/Awaited/typeof 等类型派生手段。参数传递应使用对象而非位置参数,使参数顺序自解释;但在热点路径(逐帧渲染、分词器、解析器)上可跳过这一做法。

在测试与可观测性方面,技能建议编写真实测试:能运行的不要 mock,优先使用框架真实的测试原语并配合泄漏/可释放检查,并在运行中的构建里验证 UI,只 mock 本地无法运行的部分。遥测日志应结构化,优先使用带足够上下文的诊断日志以便凭 id 定位问题;发布代码中不应出现 console.log。

具体示例见 references/patterns.md。关于该技能的收费、价格、支持平台与安装方式,资料中暂未提供。