migrate-to-shoehorn
将测试文件中的 `as` 类型断言迁移至 @total-typescript/shoehorn。当用户提到 shoehorn、希望替换测试中的 `as`,或需要部分测试数据时使用。
Migrate to Shoehorn — 用类型安全的方式替代测试里的 as 断言
技能概述
这个技能帮你把测试文件里的 as 类型断言迁移到 @total-typescript/shoehorn,让测试既可以只传部分数据,又能通过 TypeScript 类型检查。
适用场景
-
类型属性很多,但测试只关心其中一两个 比如一个
Request类型有body、headers、cookies等二十多个属性,测试只用到body.id。以前要伪造整个对象,现在用fromPartial()只写用到的字段就能通过类型检查。 -
测错误分支时需要故意传错类型的数据 比如验证
body.id是数字时的报错行为。此前只能写as unknown as Request双重断言,迁移后用fromAny(),既保留自动补全,又明确表达"这里的类型是故意写错的"。 -
团队规范禁止在测试里使用
as,需要成批替换 技能提供了从搜索、替换到类型检查的完整清单,包括grep命令和三类 API 的一一对应关系,适合一次性把一个仓库的测试文件迁移完。
核心功能
-
fromPartial()— 传部分数据,仍然类型安全 替代as Type。传入的对象只写测试真正关心的属性即可,不需要补齐整个类型的所有字段,返回值仍是完整的目标类型。 -
fromAny()— 传故意写错的数据 替代as unknown as Type。用于错误分支测试,允许传入不符合类型定义的值,同时不丢失编辑器的自动补全。 -
fromExact()— 强制传完整对象 要求对象字段齐全。适合作为迁移的中间态:先用fromExact()保证完整,之后再按需要换成fromPartial()。 -
配套的迁移流程 包含安装依赖、用
grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"找出所有断言、逐个替换、补充 import、最后跑类型检查验证。
常见问题
shoehorn 是什么?解决什么问题?
它是 @total-typescript 出的一个测试辅助库。TypeScript 测试里经常出现 as 断言:要么是为了伪造一个属性很多的大对象,要么是为了故意传错数据测错误分支。as 的问题是它绕过了类型检查、必须手写目标类型,遇到故意写错的场景还得双重断言 as unknown as Type。shoehorn 用 fromPartial()、fromAny()、fromExact() 三个函数替代这些写法,让部分数据也能通过类型检查。
shoehorn 可以在生产代码里用吗?
不可以。这个技能明确限定 只用于测试代码。它的作用是放宽测试数据的类型要求,放到生产代码里等于把类型检查的口子开在了业务逻辑上,与使用它的初衷相反。
fromPartial 和 fromAny 有什么区别?
fromPartial() 用于传部分但类型正确的数据,传入的字段依然会被类型检查,写错字段名或字段类型会报错。fromAny() 用于传故意写错的数据,字段类型不再受约束,但仍然保留自动补全。简单说:写少了用 fromPartial(),写错了用 fromAny()。
用了 fromPartial 还需要写全对象的所有属性吗?
不需要。这正是它替代 as 的主要价值。你只写测试真正用到的那部分字段,其余属性不必伪造。反过来说,如果你希望某个对象必须写全,就用 fromExact(),它会在缺字段时报错。
迁移后需要做什么验证?
必须跑一次类型检查。因为迁移过程中涉及大量 as 断言的删除和 import 的补充,只有类型检查通过才能确认替换后仍然类型安全。这也是技能清单里的最后一步。