You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化校验TypeScript自定义类型约束,避免重构后出现功能回归

TypeScript 复杂类型约束的自动化校验方案

1. 负向测试(预期编译报错的场景)

用TS原生的@ts-expect-error注释指令解决,放在预期会报错的代码行上方即可:

// @ts-expect-error 10 不是质数,此处应当触发 Primes 接口的类型校验错误
const notReallyPrimes: Primes = { score: 10 }

如果你的PrimeNumber类型约束被意外放宽(比如允许所有数字),这段代码不会产生编译错误,TS就会主动抛出Unused '@ts-expect-error' directive的提示,告知你约束已经失效。

2. 正向/反向类型断言测试

你可以预先定义两个通用的类型测试工具,无需引入第三方依赖即可实现细粒度的类型校验:

// 通用类型测试工具
type Expect<T extends true> = T
type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false

针对你的场景可以编写如下测试用例,TS在编译阶段就会自动校验正确性:

// 正向测试:合法质数应当符合类型约束
type TestCase_ValidPrime2 = Expect<Equal<2 extends PrimeNumber ? true : false, true>>
type TestCase_ValidPrime7 = Expect<Equal<7 extends PrimeNumber ? true : false, true>>
type TestCase_ValidPrime7919 = Expect<Equal<7919 extends PrimeNumber ? true : false, true>>

// 反向测试:非质数应当不符合类型约束
type TestCase_InvalidPrime10 = Expect<Equal<10 extends PrimeNumber ? true : false, false>>

// 也可以直接测试整体接口赋值的合法性
type TestCase_PrimesInterfaceValid = Expect<Equal<typeof myPrimes extends Primes ? true : false, true>>

3. 自动化集成

将所有类型测试用例存放到单独的目录(比如tests/type-checks),在项目的package.json中添加类型校验脚本:

{
  "scripts": {
    "test:types": "tsc --noEmit tests/type-checks/**/*.ts"
  }
}

每次重构前执行npm run test:types即可完成全量校验,也可以把这个步骤加入CI流水线,完全避免人工验证的遗漏。

如果是更复杂的类型测试场景,也可以使用tsd这类专门的类型测试工具,核心逻辑和上述原生方案一致。

内容的提问来源于stack exchange,提问作者JD Isaacks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:18:00