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
- 01Strict typing and safe data parsing
- 02Type guard and union examples
- 03tsconfig configuration guidance
- 04Testing, formatting, and lint tools
- 05Explanations of common TypeScript pitfalls
Use cases
- 01Set coding conventions for a TypeScript project
- 02Parse boundary data with type safety
- 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-typescriptAfter installing, type/writing-typescriptin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
PATTERNS.mdREACT.mdTESTING.mdDetails
From the project READMETypeScript 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, preferunknown
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
- PATTERNS.md - Code patterns and style
- REACT.md - React component patterns
- TESTING.md - Testing with vitest
Commands
bun install # Install deps
bun run build # Build
bun test # Test
bun run lint # Lint
bun run format # Format
Gotchas
import typewithverbatimModuleSyntaxand named exports: type-only import of a value triggers errors. Fix:import { type Foo } from "mod"(inline marker).as conston object: readonly AND literal-narrowed — different fromas Foo(asserts type) orsatisfies Foo(validates without widening).satisfiesvalidates without widening;aswidens — usingaswhere you wantedsatisfiesloses literal types silently.Array<T>.includes(x)requiresxto be of typeT— narrowing-from-union doesn't work; the standard fix is a type-predicate helper.strictNullChecks: falsemakesTmeanT | null | undefinedfor ALL types — partial migrations leave types that lie about nullability.tsconfig.jsonextendsdoesn't recursively mergecompilerOptions.paths— child paths REPLACE parent paths, not merge.
Comments
Markdown supported