migrate-to-shoehorn

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.

npx skills add https://github.com/mattpocock/skills --skill migrate-to-shoehorn

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 Type → fromPartial()

Before:

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

After:

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

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

as unknown as Type → fromAny()

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

Plus de skills de mattpocock

writing-for-agents
mattpocock
Rédaction de documents pour les agents. À utiliser lors de la création ou de la modification de compétences, ou de la mise à jour de AGENTS.md ou CLAUDE.md.
wait-what
mattpocock
Stop. Ce dernier message n'a pas pris — reformule-le.
communication
to-questionnaire
mattpocock
Transformez une décision que vous ne pouvez pas entièrement résoudre en un questionnaire à remplir par quelqu’un d’autre.
grill-me
mattpocock
Interroger l'utilisateur sans relâche sur un plan ou un design jusqu'à parvenir à une compréhension commune, en résolvant chaque branche de l'arbre de décision. Utiliser lorsque l'utilisateur souhaite mettre un plan à l'épreuve, se faire questionner sur son design, ou mentionne "grill me".
researchcommunicationproject-management
tdd
mattpocock
Développement piloté par les tests avec boucle rouge-vert-refactorisation. À utiliser lorsque l'utilisateur souhaite développer des fonctionnalités ou corriger des bugs en utilisant le TDD, mentionne "rouge-vert-refactorisation", veut des tests d'intégration, ou demande un développement test-first.
developmenttesting
handoff
mattpocock
Compacter la conversation actuelle en un document de transfert pour qu’un autre agent puisse le reprendre.
communicationproject-managementdocument
prototype
mattpocock
Construisez un prototype jetable pour étoffer une conception avant de vous y engager. Achemine entre deux branches — une application terminal exécutable pour les questions d'état/logique métier, ou plusieurs variations d'interface utilisateur radicalement différentes, basculables depuis une seule route. À utiliser lorsque l'utilisateur souhaite prototyper, vérifier la cohérence d'un modèle de données ou d'une machine d'état, maquetter une interface utilisateur, explorer des options de conception, ou dit « prototype ceci », « laisse-moi jouer avec », « essaie quelques designs ».
developmentdesigncreative
triage
mattpocock
Trier les problèmes via une machine à états pilotée par des rôles de triage. Utiliser lorsque l'utilisateur souhaite créer un problème, trier des problèmes, examiner les bogues entrants ou les demandes de fonctionnalités, préparer des problèmes pour un agent AFK, ou gérer le flux de travail des problèmes.
developmentproject-managementcommunication