如何自动化校验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
相关产品推荐
相关产品推荐

