{title="📊 页面导航】

适用角色与上手难度

角色推荐度上手难度
🛠️ 开发★★★★★★☆☆☆☆
🧪 测试★★★★★★☆☆☆☆
📦 产品★☆☆☆☆★☆☆☆☆

🎯 学习产出: 掌握 shoehorn 迁移方法,能用类型安全的方式在测试中传部分数据

🚀 AI 能力提升: 类型安全、测试质量

migrate-to-shoehorn

预计阅读时间: 3 分钟

测试断言迁移。把测试文件里的 as 类型断言迁移到 @total-typescript/shoehorn只改测试代码,绝不进生产代码。

概述

为什么用 shoehorn? 它让你在测试里传部分数据而保持 TypeScript 满意,用类型安全替代 as 断言。as 在测试里的问题:模型被训练得不爱用它;必须手动指定目标类型;故意传错数据要双重断言 as unknown as Type

日常使用

> 把测试里那些 as 断言换成 shoehorn

实战

安装

npm i @total-typescript/shoehorn

三个迁移模式

大对象只要几个属性

type Request = {
  body: { id: string };
  headers: Record<string, string>;
  cookies: Record<string, string>;
  // ...20 多个属性
};

// 之前:只关心 body.id 却必须伪造整个 Request
getUser({ body: { id: '123' }, headers: {}, cookies: {} /* ... */ });

// 之后
import { fromPartial } from '@total-typescript/shoehorn';
getUser(fromPartial({ body: { id: '123' } }));

as TypefromPartial()

getUser({ body: { id: '123' } } as Request);
// →
getUser(fromPartial({ body: { id: '123' } }));

as unknown as TypefromAny()(故意传错数据):

getUser({ body: { id: 123 } } as unknown as Request);
// →
getUser(fromAny({ body: { id: 123 } }));

何时用哪个

函数用途
fromPartial()传部分数据但仍通过类型检查
fromAny()故意传错数据(保留自动补全)
fromExact()强制完整对象(之后再换回 partial)

工作流

  1. 收集需求:哪些测试文件的 as 断言有问题?是大对象只要部分属性吗?要故意传错数据做错误测试吗?
  2. 安装并迁移:安装 → 找到断言(grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts")→ as TypefromPartial()as unknown as TypefromAny() → 加 import → 跑类型检查验证

与其它技能的关系

  • 同类setup-pre-commit 的 typecheck 会在迁移后立刻验证类型正确
  • 仅 TypeScript:为 TS 测试生态设计