Skip to content
Development
Skill

/typescript-best-practices

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

BOOST
From plugin
khanelinix
34750 skills10 agents6 commands
Install
$ npx -y skills add khaneliman/khanelinix --skill typescript-best-practices --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/typescript-best-practices

Context preview

The summary Claude sees to decide when to auto-load this skill.

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

SKILL.md

typescript-best-practices.SKILL.md
name: typescript-best-practices
description: TypeScript best practices. Use when reading or editing any .ts or .tsx file.

TypeScript best practices

Apply `type-system-discipline` from `engineering-principles` first. This skill grounds that principle in TypeScript syntax.

| Rule | Summary | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Discriminated unions | Model variants with a `kind` literal discriminant so impossible states can't be represented. No optional-field bags. | | Branded types | Brand primitives with `& { readonly __brand: "X" }` so they can't be mixed up. Validate once at creation. | | Constructive modeling | Build 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 type | Keep `T[]` while every operation on it stays total. Strengthen to `NonEmpty<T>` only where the loose type forces `!`, a cast, or a "should never happen" throw. | | `unknown` over `any` | External data is `unknown`. `any` disables type checking everywhere it touches. | | Avoid unchecked assertions | Type assertions add no runtime validation. Prefer narrowing; assert only when evidence establishes the claimed type. | | Narrowing hierarchy | Discriminant switch > `in` operator > `typeof`/`instanceof` > user-defined type guard > `as`. | | Type guards | Must 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`. | | Exhaustiveness | Inline `const _exhaustive: never = x;` in default arms so the compiler errors when a new variant is added. | | `satisfies` over `as` | Validates the value without widening literal types. | | Boundary validation | Validate where data crosses in; trust types inside. Apply `boundary-discipline` from `engineering-principles`. | | Schema-derived types | Reach for `Pick`/`Omit`/`Parameters`/`ReturnType`/`Awaited`/`typeof` before declaring a new interface. | | Object args | Pass objects, not positional, so argument order is self-documenting. Skip on hot paths (per-frame render, tokenizers, parsers). | | Real tests | Don'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 telemetry | Prefer structured logger diagnostics with enough context to debug from an id. No `console.log` in shipped code. |

Examples: `references/patterns.md`.

Read more
Ships withkhanelinix

Run packages directly with: Or install from the packages output. For example:

Get the whole plugin

Other skills on khanelinix.