技能migrate-to-shoehorn
M

migrate-to-shoehorn

将测试文件中的 `as` 类型断言迁移至 @total-typescript/shoehorn。当用户提到 shoehorn、希望替换测试中的 `as`,或需要部分测试数据时使用。

Migrate to Shoehorn — 用类型安全的方式替代测试里的 as 断言

技能概述

这个技能帮你把测试文件里的 as 类型断言迁移到 @total-typescript/shoehorn,让测试既可以只传部分数据,又能通过 TypeScript 类型检查。

适用场景

  1. 类型属性很多,但测试只关心其中一两个 比如一个 Request 类型有 bodyheaderscookies 等二十多个属性,测试只用到 body.id。以前要伪造整个对象,现在用 fromPartial() 只写用到的字段就能通过类型检查。

  2. 测错误分支时需要故意传错类型的数据 比如验证 body.id 是数字时的报错行为。此前只能写 as unknown as Request 双重断言,迁移后用 fromAny(),既保留自动补全,又明确表达"这里的类型是故意写错的"。

  3. 团队规范禁止在测试里使用 as,需要成批替换 技能提供了从搜索、替换到类型检查的完整清单,包括 grep 命令和三类 API 的一一对应关系,适合一次性把一个仓库的测试文件迁移完。

核心功能

  1. fromPartial() — 传部分数据,仍然类型安全 替代 as Type。传入的对象只写测试真正关心的属性即可,不需要补齐整个类型的所有字段,返回值仍是完整的目标类型。

  2. fromAny() — 传故意写错的数据 替代 as unknown as Type。用于错误分支测试,允许传入不符合类型定义的值,同时不丢失编辑器的自动补全。

  3. fromExact() — 强制传完整对象 要求对象字段齐全。适合作为迁移的中间态:先用 fromExact() 保证完整,之后再按需要换成 fromPartial()

  4. 配套的迁移流程 包含安装依赖、用 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 可以在生产代码里用吗?

不可以。这个技能明确限定 只用于测试代码。它的作用是放宽测试数据的类型要求,放到生产代码里等于把类型检查的口子开在了业务逻辑上,与使用它的初衷相反。

fromPartialfromAny 有什么区别?

fromPartial() 用于传部分但类型正确的数据,传入的字段依然会被类型检查,写错字段名或字段类型会报错。fromAny() 用于传故意写错的数据,字段类型不再受约束,但仍然保留自动补全。简单说:写少了用 fromPartial(),写错了用 fromAny()

用了 fromPartial 还需要写全对象的所有属性吗?

不需要。这正是它替代 as 的主要价值。你只写测试真正用到的那部分字段,其余属性不必伪造。反过来说,如果你希望某个对象必须写全,就用 fromExact(),它会在缺字段时报错。

迁移后需要做什么验证?

必须跑一次类型检查。因为迁移过程中涉及大量 as 断言的删除和 import 的补充,只有类型检查通过才能确认替换后仍然类型安全。这也是技能清单里的最后一步。