Shoehorn 测试断言迁移
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md 安装规范名 @kunlungrowth/migrate-to-shoehorn 的技能。
技能介绍
它解决什么问题
在 TypeScript 测试里传部分数据是常态,但很多人会用 as Request 或 as unknown as Request 来绕过类型检查。前者脆弱易碎,后者干脆放弃类型约束。结果是:测试看似在跑,实际是在靠断言硬撑,一旦接口字段变化,大量测试会莫名其妙地通过或失败。
这个技能要解决的就是这种「靠 as 续命」的写法,把测试中针对部分数据、故意错误数据的传参方式,迁移到 @total-typescript/shoehorn,让类型系统继续提供自动补全和检查能力,而不是被断言绕过。
技能如何工作
核心是三个函数,对应三种场景:
- fromPartial():传部分数据,其余字段可选。用于只想给接口填少量字段、不关心完整结构的情况,替代
as Type。 - fromAny():传故意错误的数据,仍保留自动补全。用于负向测试,替代
as unknown as Type。 - fromExact():强制完整对象,后续可按需降级为 fromPartial。
迁移时,技能会先确认哪些测试文件包含 as 断言,是否涉及大对象、是否需要故意错数据。然后它会安装 @total-typescript/shoehorn 作为 devDependency,在测试文件中定位断言,按上述模式替换并补上 import。最后跑一次类型检查,确认替换后测试仍然类型安全。
替换完成后,技能会输出一份 MigrationReport,记录被替换的文件、as_to_partial 和 as_unknown_to_any 的数量,以及类型检查是否通过。这份报告可以交给后续的 TDD 或代码审查环节继续使用。
适用边界与注意点
这个技能只作用于测试代码,绝不修改生产实现。它不处理非 TypeScript 测试,也不会动生产逻辑。如果你的断言出现在源文件而非测试文件里,它不会介入。
另外,它只针对 as Type 和 as unknown as Type 两种模式。如果你测试里的类型问题来自更复杂的构造器或自定义类型守卫,它不会自动迁移。
使用场景
- 在TypeScript项目测试中,发现大量`as`或`as unknown as`断言,想替换成shoehorn的类型安全写法
- 编写负向测试时,需要传故意错误的数据,同时想保留自动补全,替代原来的`as unknown as`写法
- 面对接口大对象,测试时只需填充少量字段,不想伪造全部属性,想优化测试数据构造
适合人员
- TypeScript开发工程师,希望优化测试代码的类型安全性,替换掉脆弱的as断言
- 负责编写负向测试的开发人员,需要在传错误数据时保留自动补全能力
- 维护大型接口测试套件的工程师,想简化大对象测试数据的构造过程