Back

Typescript Best Practices

Coding8.3K installs

What it does

TypeScript best practices. Use when reading or editing any .ts or .tsx file.

Install

npx skills add https://github.com/backnotprop/pstack --skill typescript-best-practices

Website

www.skills.sh/backnotprop/pstack/typescript-best-practices

Details

From the skill’s SKILL.md or README, by its authors. View the original

TypeScript best practices

Apply the type-system-discipline principle skill first.

RuleSummary
Discriminated unionsModel variants with a kind literal discriminant so impossible states can't be represented. No optional-field bags.
Branded typesBrand primitives with & { readonly __brand: "X" } so they can't be mixed up. Validate once at the boundary. A brand comes from a verifying type guard (input is AgentId), never from as.
Constructive modelingBuild the shape so the illegal value can't be constructed. [T, ...T[]] for non-empty, [T, T][] for even length, start plus duration for a range. Not a runtime guard, not a wish for refinement types.
Simplest total typeKeep T[] while every operation on it stays total. Strengthen to NonEmpty only where the loose type forces !, a cast, or a should never happen throw.
unknown over anyExternal data is unknown.
Schemas before guardsBefore hand-writing a property-by-property type guard, use the repository's runtime schema library and infer the type from the schema, such as z.infer.
No as castsEvery as is a runtime crash waiting. Cast only after validation.
Narrowing hierarchyDiscriminant switch > in operator > typeof/instanceof > user-defined type guard > as.
Type guardsMust verify the claim. A lying guard is worse than as because the bug hides behind a name that says it's safe. Name them isX or hasX.
ExhaustivenessInline const _exhaustive: never = x; in default arms so the compiler errors when a new variant is added.
satisfies over asValidates the value without widening literal types.
Boundary validationParse where data crosses in, into a named domain type. Record (however spelled) stops at that parse. Trust types inside. See the boundary-discipline principle skill.
Schema-derived typesReach for Pick/Omit/Parameters/ReturnType/Awaited/typeof before declaring a new interface.
Object argsPass objects, not positional, so argument order is self-documenting. Skip on hot paths (per-frame render, tokenizers, parsers).
Real testsDon't mock what you can run. Prefer the framework's real test primitives with leak/disposable checks, and verify UI in a running build. Mock only what you can't run locally.
Structured telemetryPrefer structured logger diagnostics with enough context to debug from an id. No console.log in shipped code.

Examples: references/patterns.md.

See all
  • Coding

    Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.

    npx skills add https://github.com/mattpocock/skills --skill improve-codebase-architecture
    1.2M installs
  • Coding

    React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data…

    npx skills add https://github.com/vercel-labs/agent-skills --skill vercel-react-best-practices
    881K installs
  • Coding

    Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes: Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match what the originating issue/spec asked for?). Runs both reviews in parallel…

    npx skills add https://github.com/mattpocock/skills --skill code-review
    869.3K installs
  • Coding

    Use when you need to resolve an in-progress git merge/rebase conflict.

    npx skills add https://github.com/mattpocock/skills --skill resolving-merge-conflicts
    551.2K installs

Skills are shared by members and not reviewed by us. Read a skill’s code before you install it.