Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
vinvcn avatar

Migrate To Shoehorn

  • 3.2k installs
  • 2.8k repo stars
  • Updated July 27, 2026
  • vinvcn/mattpocock-skills-zh-cn

migrate-to-shoehorn is an agent skill that 将 test files 从 `as` type assertions 迁移到 @total-typescript/shoehorn。Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.

About

The migrate-to-shoehorn skill. 将 test files 从 `as` type assertions 迁移到 @total-typescript/shoehorn。Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data. **Gather requirements** - 询问用户: - 哪些 test files 中的 assertions 造成问题? - 是否在处理大型 objects,但只关心部分 properties? - 是否需要传入故意错误的数据来测试 error paths? 2. **Install and migrate**: - [ ] Install: - [ ] 查找 test files 中的 assertions: - [ ] 用 替换 - [ ] 用 替换 - [ ] 添加来自 的 imports - [ ] 运行 type check 验证. The workflow follows the source SKILL.md contract with progressive reference loading, clear trigger phrases, and practical steps developers can apply directly in agent sessions. The workflow follows the source SKILL.md contract with progressive reference loading, clear trigger phrases, and practical steps developers can apply directly in agent sessions. The workflow follows the source SKILL.md contract with progressive reference loading, clear trigger phrases, and practical steps developers can apply directly in agent sessions.

  • 对故意错误的数据需要 double-as(`as unknown as Type`)
  • Gather requirements - 询问用户:
  • 哪些 test files 中的 `as` assertions 造成问题?
  • 是否在处理大型 objects,但只关心部分 properties?
  • 是否需要传入故意错误的数据来测试 error paths?

Migrate To Shoehorn by the numbers

  • 3,213 all-time installs (skills.sh)
  • +393 installs in the week ending Aug 2, 2026 (Skillselion tracking)
  • Ranked #307 of 2,155 Testing & QA skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
At a glance

migrate-to-shoehorn capabilities & compatibility

Capabilities
对故意错误的数据需要 double as(`as unknown as type`) · gather requirements 询问用户: · 哪些 test files 中的 `as` assertions 造成问题? · 是否在处理大型 objects,但只关心部分 properties? · 是否需要传入故意错误的数据来测试 error paths?
Use cases
testing · debugging · ci cd
npx skills add https://github.com/vinvcn/mattpocock-skills-zh-cn --skill migrate-to-shoehorn

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs3.2k
repo stars2.8k
Security audit3 / 3 scanners passed
Last updatedJuly 27, 2026
Repositoryvinvcn/mattpocock-skills-zh-cn

How do I apply migrate-to-shoehorn correctly using the SKILL.md workflows and reference files?

将 test files 从 `as` type assertions 迁移到 @total-typescript/shoehorn。Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.

Who is it for?

Developers and software engineers working with migrate-to-shoehorn patterns from the skill documentation.

Skip if: Skip when cached docs are empty, boilerplate-only, or outside the skill documented scope.

When should I use this skill?

将 test files 从 `as` type assertions 迁移到 @total-typescript/shoehorn。Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.

What you get

Grounded migrate-to-shoehorn guidance with highlights, triggers, and evidence quotes from SKILL.md.

  • refactored test files with shoehorn fixtures

Files

SKILL.mdMarkdownGitHub ↗

Migrate to Shoehorn

Why shoehorn?

shoehorn 允许你在 tests 中传入 partial data,同时保持 TypeScript 满意。它用 type-safe alternatives 替换 as assertions。

只用于 test code。 永远不要在 production code 中使用 shoehorn。

Tests 中 as 的问题:

  • 会训练人忽略类型安全
  • 必须手动指定 target type
  • 对故意错误的数据需要 double-as(as unknown as Type

Install

npm i @total-typescript/shoehorn

Migration patterns

Large objects with few needed properties

Before:

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
  });
});

After:

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

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

as TypefromPartial()

Before:

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

After:

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

getUser(fromPartial({ body: { id: "123" } }));

as unknown as TypefromAny()

Before:

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

After:

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

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

When to use each

FunctionUse case
fromPartial()传入仍能 type-check 的 partial data
fromAny()传入故意错误的数据(保留 autocomplete)
fromExact()强制 full object(之后可换成 fromPartial)

Workflow

1. Gather requirements — 询问用户:

  • 哪些 test files 中的 as assertions 造成问题?
  • 是否在处理大型 objects,但只关心部分 properties?
  • 是否需要传入故意错误的数据来测试 error paths?

2. Install and migrate

  • [ ] Install: npm i @total-typescript/shoehorn
  • [ ] 查找 test files 中的 as assertions: grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"
  • [ ] 用 fromPartial() 替换 as Type
  • [ ] 用 fromAny() 替换 as unknown as Type
  • [ ] 添加来自 @total-typescript/shoehorn 的 imports
  • [ ] 运行 type check 验证

Related skills

How it compares

Use migrate-to-shoehorn when test files rely on `as` casts instead of maintaining hand-written full object fixtures or factory helpers.

FAQ

Who is migrate-to-shoehorn for?

Developers and software engineers working with migrate-to-shoehorn patterns from the skill documentation.

When should I use migrate-to-shoehorn?

将 test files 从 `as` type assertions 迁移到 @total-typescript/shoehorn。Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.

Is migrate-to-shoehorn safe to install?

Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.