mcpField
M
migrate-to-shoehorn

migrate-to-shoehorn

github.com/utarn测试与质量4964 次安装8 周前更新
代码仓库

关于 migrate-to-shoehorn

migrate-to-shoehorn 是一项面向 TypeScript 测试代码的迁移技能,帮助用 shoehorn 函数替代类型断言。它区分部分数据、刻意错误数据和完整对象的处理方式。

主要功能

  1. 01以 fromPartial() 替代类型断言
  2. 02以 fromAny() 传入刻意错误数据
  3. 03用 fromExact() 强制完整对象
  4. 04查找测试文件中的类型断言
  5. 05运行类型检查验证迁移

适用场景

  1. 01测试大型对象但只需少量属性
  2. 02测试错误输入处理
  3. 03迁移测试中的双重类型断言

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/utarn/engineer-skills --skill migrate-to-shoehorn

安装后在 Claude Code 中输入/migrate-to-shoehorn确认已加载。

附带文件agents/openai.yaml

详细介绍

迁移到 Shoehorn

为什么使用 shoehorn?

shoehorn 让你在测试中传入部分数据,同时保持 TypeScript 类型检查通过。它用类型安全的替代方案取代 as 断言。

仅限测试代码。 切勿在生产代码中使用 shoehorn。

在测试中使用 as 的问题:

  • 已养成避免使用它的习惯
  • 必须手动指定目标类型
  • 为故意传入错误数据而需要双重 as(as unknown as Type)

安装

npm i @total-typescript/shoehorn

迁移模式

大对象但只需少量属性

迁移前:

type Request = {
  body: { id: string };
  headers: Record<string, string>;
  cookies: Record<string, string>;
  // ...20 more properties
};

it("gets user by id", () => {
  // Only care about body.id but must fake entire Request
  getUser({
    body: { id: "123" },
    headers: {},
    cookies: {},
    // ...fake all 20 properties
  });
});

迁移后:

import { fromPartial } from "@total-typescript/shoehorn";

it("gets user by id", () => {
  getUser(
    fromPartial({
      body: { id: "123" },
    }),
  );
});
as Type → fromPartial()

迁移前:

getUser({ body: { id: "123" } } as Request);

迁移后:

import { fromPartial } from "@total-typescript/shoehorn";

getUser(fromPartial({ body: { id: "123" } }));
as unknown as Type → fromAny()

迁移前:

getUser({ body: { id: 123 } } as unknown as Request); // wrong type on purpose

迁移后:

import { fromAny } from "@total-typescript/shoehorn";

getUser(fromAny({ body: { id: 123 } }));

各函数的使用场景

函数使用场景
fromPartial()传入仍能通过类型检查的部分数据
fromAny()传入故意错误的数据(保留自动补全)
fromExact()强制使用完整对象(之后可与 fromPartial 互换)

工作流程

  1. 收集需求 - 询问用户:

    • 哪些测试文件中的 as 断言引发了问题?
    • 它们是否处理只有部分属性有用的大对象?
    • 是否需要为错误测试传入故意错误的数据?
  2. 安装并迁移:

    • 安装:npm i @total-typescript/shoehorn
    • 查找带有 as 断言的测试文件:grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"
    • 将 as Type 替换为 fromPartial()
    • 将 as unknown as Type 替换为 fromAny()
    • 添加来自 @total-typescript/shoehorn 的导入
    • 运行类型检查以验证

评论

支持 Markdown