mcpField
W
writing-typescript

writing-typescript

github.com/julianobarbosaDevelopment14110 installsUpdated 2d ago
Repository

About writing-typescript

writing-typescript is a development skill reference for TypeScript programmers, covering strict typing, safe data handling, and compositional design. It includes code patterns, toolchain guidance, configuration advice, and common pitfalls.

Key features

  1. 01Strict typing and safe data parsing
  2. 02Type guard and union examples
  3. 03tsconfig configuration guidance
  4. 04Testing, formatting, and lint tools
  5. 05Explanations of common TypeScript pitfalls

Use cases

  1. 01Set coding conventions for a TypeScript project
  2. 02Parse boundary data with type safety
  3. 03Configure build, test, and lint workflows

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill writing-typescript

After installing, type/writing-typescriptin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

PATTERNS.md
REACT.md
TESTING.md

Details

From the project README

TypeScript Development (2025)

Core Principles

  • Strict typing: Enable all strict checks
  • Parse, don't validate: Transform untrusted data at boundaries
  • Composition over inheritance: Small, focused functions
  • Explicit over implicit: No any, prefer unknown

Toolchain

bun          # Runtime + package manager (fast)
vite         # Frontend bundling
vitest       # Testing
eslint       # Linting
prettier     # Formatting

Quick Patterns

Type Guards
function isUser(value: unknown): value is User {
  return typeof value === "object" && value !== null && "id" in value;
}
Discriminated Unions
type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };

function processResult<T>(result: Result<T>): T {
  if (result.ok) return result.value;
  throw result.error;
}
Utility Types
type UserUpdate = Partial<User>;
type UserSummary = Pick<User, "id" | "name">;
type UserWithoutPassword = Omit<User, "password">;
type ReadonlyUser = Readonly<User>;

tsconfig.json Essentials

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "noImplicitReturns": true,
    "isolatedModules": true
  }
}

References

Commands

bun install              # Install deps
bun run build            # Build
bun test                 # Test
bun run lint             # Lint
bun run format           # Format

Gotchas

  • import type with verbatimModuleSyntax and named exports: type-only import of a value triggers errors. Fix: import { type Foo } from "mod" (inline marker).
  • as const on object: readonly AND literal-narrowed — different from as Foo (asserts type) or satisfies Foo (validates without widening).
  • satisfies validates without widening; as widens — using as where you wanted satisfies loses literal types silently.
  • Array<T>.includes(x) requires x to be of type T — narrowing-from-union doesn't work; the standard fix is a type-predicate helper.
  • strictNullChecks: false makes T mean T | null | undefined for ALL types — partial migrations leave types that lie about nullability.
  • tsconfig.json extends doesn't recursively merge compilerOptions.paths — child paths REPLACE parent paths, not merge.

Comments

Markdown supported