MI

Replaces dangerous 'as' type assertions in tests with safer, partial data patterns.

Install

mkdir -p .claude/skills/migrate-to-shoehorn && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/11496" && unzip -o skill.zip -d .claude/skills/migrate-to-shoehorn && rm skill.zip

Installs to .claude/skills/migrate-to-shoehorn

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

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.
168 chars✓ has a “when” trigger
Intermediate

Key capabilities

  • Replace `as Type` assertions with `fromPartial()`
  • Replace `as unknown as Type` assertions with `fromAny()`
  • Pass partial data in tests while maintaining type safety
  • Pass intentionally wrong data in tests while maintaining autocomplete
  • Force full object validation with `fromExact()`
  • Install `@total-typescript/shoehorn` for type-safe testing

How it works

This skill migrates test files from `as` type assertions to `@total-typescript/shoehorn` by replacing `as Type` with `fromPartial()` and `as unknown as Type` with `fromAny()`. It uses `fromPartial()` for partial data and `fromAny()` for intentionally wrong data.

Inputs & outputs

You give it
test files with `as` type assertions
You get back
test files using `@total-typescript/shoehorn` for type-safe partial data

When to use migrate-to-shoehorn

  • Refactoring tests
  • Removing type assertions
  • Handling partial test objects
  • Improving test safety

About this skill

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

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()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

When not to use it

  • When the code is for production environments
  • When the user does not want to replace `as` assertions in tests
  • When the user does not need to handle partial test data

Limitations

  • Shoehorn should only be used in test code, not production code.
  • `fromPartial()` is used to pass partial data that still type-checks.
  • `fromAny()` is used to pass intentionally wrong data while keeping autocomplete.

How it compares

This migration replaces unsafe `as` assertions with type-safe alternatives, improving test reliability compared to manual type casting.

Compared to similar skills

migrate-to-shoehorn side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
migrate-to-shoehorn (this skill)03moReviewIntermediate
tdd-workflow64moReviewIntermediate
migrate15moReviewIntermediate
agent-implementer-sparc-coder16moReviewIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry