Migrate To Shoehorn

作者 mattpocockc55ee46073ed無授權條款收錄於 2026年10月8日更新於 2026年10月8日

Migrate test files from `as` type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.

AI 產生的概覽

將 TypeScript 測試檔案中的 as 型別斷言遷移為 @total-typescript/shoehorn 的 fromPartial、fromAny 與 fromExact 輔助函式。

功能
此技能引導代理把 TypeScript 測試檔案中的 as 型別斷言替換成 @total-typescript/shoehorn 套件提供的輔助函式。它說明 as Type 對應 fromPartial()、as unknown as Type 對應 fromAny() 的對應關係,以及何時使用 fromExact(),並附有修改前後的程式碼範例。它也提供一套工作流程,涵蓋安裝、尋找含斷言的測試檔案、執行替換、加入匯入並執行型別檢查。它僅適用於測試程式碼,不適用於正式環境程式碼。
適用情境
當使用者提到 shoehorn、想從測試中移除 as 斷言,或需要在維持 TypeScript 型別檢查的前提下傳入部分資料或刻意錯誤的資料時使用。它適合測試檔案依賴型別斷言處理大型物件的 TypeScript 專案。
執行需求
需要一個含測試檔案的 TypeScript 專案,並能安裝 npm 套件 @total-typescript/shoehorn;工作流程會使用 grep 與型別檢查。此技能不附帶指令碼,僅包含說明。

Migrate to Shoehorn

Why shoehorn?

shoehorn lets you pass partial data in tests while keeping TypeScript happy. It replaces as assertions with type-safe alternatives.

Test code only. Never use shoehorn in production code.

Problems with as in tests:

  • Trained not to use it
  • Must manually specify target type
  • Double-as (as unknown as Type) for intentionally wrong data

Install

bash
npm i @total-typescript/shoehorn

Migration patterns

Large objects with few needed properties

Before:

ts
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:

ts
import { fromPartial } from "@total-typescript/shoehorn";
it("gets user by id", () => {  getUser(    fromPartial({      body: { id: "123" },    }),  );});

as Type → fromPartial()

Before:

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

After:

ts
import { fromPartial } from "@total-typescript/shoehorn";
getUser(fromPartial({ body: { id: "123" } }));

as unknown as Type → fromAny()

Before:

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

After:

ts
import { fromAny } from "@total-typescript/shoehorn";
getUser(fromAny({ body: { id: 123 } }));

When to use each

FunctionUse case
fromPartial()Pass partial data that still type-checks
fromAny()Pass intentionally wrong data (keeps autocomplete)
fromExact()Force full object (swap with fromPartial later)

Workflow

  1. Gather requirements - ask user:

    • What test files have as assertions causing problems?
    • Are they dealing with large objects where only some properties matter?
    • Do they need to pass intentionally wrong data for error testing?
  2. Install and migrate:

    • Install: npm i @total-typescript/shoehorn
    • Find test files with as assertions: grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"
    • Replace as Type with fromPartial()
    • Replace as unknown as Type with fromAny()
    • Add imports from @total-typescript/shoehorn
    • Run type check to verify

來源與署名

來源:mattpocock/skills位於skills/misc/migrate-to-shoehorn提交c55ee46

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架