
Product
Announcing Socket Fix 2.0
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.
@total-typescript/shoehorn
Advanced tools
shoehornnpm i @total-typescript/shoehorn
shoehorn (meaning "to force something into a space") lets you pass partial data in tests while keeping TypeScript happy.
Using 'as' in tests feels bad.
type Request = {
body: {
id: string;
};
// Imagine oodles of other properties...
};
it("Should get the user", () => {
// Even though we only care about body.id for
// this test, we need to pass in the whole Request
// object
getUser({
body: {
id: "123",
},
} as Request);
});
as unknown as User)shoehorn gives you some first-class primitives for safely providing incomplete data to tests.
import { fromPartial } from "@total-typescript/shoehorn";
it("Should get the user", () => {
getUser(
fromPartial({
body: {
id: "123",
},
}),
);
});
Yes, in general. Having to pass huge objects to tests is a sign that your types are too loose. Ideally, every function should only specify the data it needs.
Unfortunately, we live in the real world. There are many cases where shoehorn is the best choice:
For each example below, imagine that the following types are defined:
type Request = {
body: {
id: string;
};
// Imagine oodles of other properties...
};
// The function we're testing
const requiresRequest = (request: Request) => {};
fromPartialLets you pass a deep partial to a slot expecting a type.
import { fromPartial } from "@total-typescript/shoehorn";
requiresRequest(
fromPartial({
body: {
id: "123",
},
}),
);
It'll fail if you pass a type that doesn't match the one expected:
// Type "1234123" has no properties in common
// with type 'PartialObjectDeep<Request>'
requiresRequest(fromPartial("1234123"));
fromAnyLets you pass anything to a slot, while still giving you autocomplete on the original type:
import { fromAny } from "@total-typescript/shoehorn";
requiresRequest(
fromAny({
body: {
id: 124123,
},
}),
);
It WILL NOT FAIL if you pass something that doesn't match.
// All good!
requiresRequest(fromAny("1234123"));
fromExactA convenience method for forcing you to pass all the properties of a type. Useful for when you want to swap in and out of fromPartial/fromAny:
import { fromExact } from "@total-typescript/shoehorn";
requiresRequest(
// Will fail! We're not passing all the oodles of
// properties of Request
fromExact({
body: {
id: 124123,
},
}),
);
FAQs
Work seamlessly with partial mocks in TypeScript.
We found that @total-typescript/shoehorn demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.

Security News
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.

Product
Socket’s new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.