TypeScript Pro
Core Workflow
- Analyze type architecture - Review tsconfig, type coverage, build performance
- Design type-first APIs - Create branded types, generics, utility types
- Implement with type safety - Write type guards, discriminated unions, conditional types; run
tsc --noEmit to catch type errors before proceeding
- Optimize build - Configure project references, incremental compilation, tree shaking; re-run
tsc --noEmit to confirm zero errors after changes
- Test types - Confirm type coverage with a tool like
type-coverage; validate that all public APIs have explicit return types; iterate on steps 3–4 until all checks pass
Reference Guide
Load detailed guidance based on context:
| Topic |
Reference |
Load When |
| Advanced Types |
references/advanced-types.md |
Generics, conditional types, mapped types, template literals |
| Type Guards |
references/type-guards.md |
Type narrowing, discriminated unions, assertion functions |
| Utility Types |
references/utility-types.md |
Partial, Pick, Omit, Record, custom utilities |
| Configuration |
references/configuration.md |
tsconfig options, strict mode, project references |
| Patterns |
references/patterns.md |
Builder pattern, factory pattern, type-safe APIs |
Code Examples
Branded Types
// Branded type for domain modeling
type Brand<T, B extends string> = T & { readonly __brand: B };
type UserId = Brand<string, "UserId">;
type OrderId = Brand<number, "OrderId">;
const toUserId = (id: string): UserId => id as UserId;
const toOrderId = (id: number): OrderId => id as OrderId;
// Usage — prevents accidental id mix-ups at compile time
function getOrder(userId: UserId, orderId: OrderId) { /* ... */ }
Discriminated Unions & Type Guards
type LoadingState = { status: "loading" };
type SuccessState = { status: "success"; data: string[] };
type ErrorState = { status: "error"; error: Error };
type RequestState = LoadingState | SuccessState | ErrorState;
// Type predicate guard
function isSuccess(state: RequestState): state is SuccessState {
return state.status === "success";
}
// Exhaustive switch with discriminated union
function renderState(state: RequestState): string {
switch (state.status) {
case "loading": return "Loading…";
case "success": return state.data.join(", ");
case "error": return state.error.message;
default: {
const _exhaustive: never = state;
throw new Error(`Unhandled state: ${_exhaustive}`);
}
}
}
Custom Utility Types
// Deep readonly — immutable nested objects
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};
// Require exactly one of a set of keys
type RequireExactlyOne<T, Keys extends keyof T = keyof T> =
Pick<T, Exclude<keyof T, Keys>> &
{ [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, never>> }[Keys];
Recommended tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"exactOptionalPropertyTypes": true,
"isolatedModules": true,
"declaration": true,
"declarationMap": true,
"incremental": true,
"skipLibCheck": false
}
}
Constraints
MUST DO
- Enable strict mode with all compiler flags
- Use type-first API design
- Implement branded types for domain modeling
- Use
satisfies operator for type validation
- Create discriminated unions for state machines
- Use
Annotated pattern with type predicates
- Generate declaration files for libraries
- Optimize for type inference
MUST NOT DO
- Use explicit
any without justification
- Skip type coverage for public APIs
- Mix type-only and value imports
- Disable strict null checks
- Use
as assertions without necessity
- Ignore compiler performance warnings
- Skip declaration file generation
- Use enums (prefer const objects with
as const)
Output Templates
When implementing TypeScript features, provide:
- Type definitions (interfaces, types, generics)
- Implementation with type guards
- tsconfig configuration if needed
- Brief explanation of type design decisions
Knowledge Reference
TypeScript 5.0+, generics, conditional types, mapped types, template literal types, discriminated unions, type guards, branded types, tRPC, project references, incremental compilation, declaration files, const assertions, satisfies operator
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: typescript-pro-23description: Implements advanced TypeScript type systems, creates custom type guards, utility types, and branded types, and configures tRPC for end-to-end type safety. Use when building TypeScript applications requiring advanced generics, conditional or mapped types, discriminated unions, monorepo setup, or full-stack type safety with tRPC. Use when this capability is needed.4---56# TypeScript Pro78## Core Workflow9101. **Analyze type architecture** - Review tsconfig, type coverage, build performance112. **Design type-first APIs** - Create branded types, generics, utility types123. **Implement with type safety** - Write type guards, discriminated unions, conditional types; run `tsc --noEmit` to catch type errors before proceeding134. **Optimize build** - Configure project references, incremental compilation, tree shaking; re-run `tsc --noEmit` to confirm zero errors after changes145. **Test types** - Confirm type coverage with a tool like `type-coverage`; validate that all public APIs have explicit return types; iterate on steps 3–4 until all checks pass1516## Reference Guide1718Load detailed guidance based on context:1920| Topic | Reference | Load When |21|-------|-----------|-----------|22| Advanced Types | `references/advanced-types.md` | Generics, conditional types, mapped types, template literals |23| Type Guards | `references/type-guards.md` | Type narrowing, discriminated unions, assertion functions |24| Utility Types | `references/utility-types.md` | Partial, Pick, Omit, Record, custom utilities |25| Configuration | `references/configuration.md` | tsconfig options, strict mode, project references |26| Patterns | `references/patterns.md` | Builder pattern, factory pattern, type-safe APIs |2728## Code Examples2930### Branded Types31```typescript32// Branded type for domain modeling33type Brand<T, B extends string> = T & { readonly __brand: B };34type UserId = Brand<string, "UserId">;35type OrderId = Brand<number, "OrderId">;3637const toUserId = (id: string): UserId => id as UserId;38const toOrderId = (id: number): OrderId => id as OrderId;3940// Usage — prevents accidental id mix-ups at compile time41function getOrder(userId: UserId, orderId: OrderId) { /* ... */ }42```4344### Discriminated Unions & Type Guards45```typescript46type LoadingState = { status: "loading" };47type SuccessState = { status: "success"; data: string[] };48type ErrorState = { status: "error"; error: Error };49type RequestState = LoadingState | SuccessState | ErrorState;5051// Type predicate guard52function isSuccess(state: RequestState): state is SuccessState {53 return state.status === "success";54}5556// Exhaustive switch with discriminated union57function renderState(state: RequestState): string {58 switch (state.status) {59 case "loading": return "Loading…";60 case "success": return state.data.join(", ");61 case "error": return state.error.message;62 default: {63 const _exhaustive: never = state;64 throw new Error(`Unhandled state: ${_exhaustive}`);65 }66 }67}68```6970### Custom Utility Types71```typescript72// Deep readonly — immutable nested objects73type DeepReadonly<T> = {74 readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];75};7677// Require exactly one of a set of keys78type RequireExactlyOne<T, Keys extends keyof T = keyof T> =79 Pick<T, Exclude<keyof T, Keys>> &80 { [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, never>> }[Keys];81```8283### Recommended tsconfig.json84```json85{86 "compilerOptions": {87 "target": "ES2022",88 "module": "NodeNext",89 "moduleResolution": "NodeNext",90 "strict": true,91 "noUncheckedIndexedAccess": true,92 "noImplicitOverride": true,93 "exactOptionalPropertyTypes": true,94 "isolatedModules": true,95 "declaration": true,96 "declarationMap": true,97 "incremental": true,98 "skipLibCheck": false99 }100}101```102103## Constraints104105### MUST DO106- Enable strict mode with all compiler flags107- Use type-first API design108- Implement branded types for domain modeling109- Use `satisfies` operator for type validation110- Create discriminated unions for state machines111- Use `Annotated` pattern with type predicates112- Generate declaration files for libraries113- Optimize for type inference114115### MUST NOT DO116- Use explicit `any` without justification117- Skip type coverage for public APIs118- Mix type-only and value imports119- Disable strict null checks120- Use `as` assertions without necessity121- Ignore compiler performance warnings122- Skip declaration file generation123- Use enums (prefer const objects with `as const`)124125## Output Templates126127When implementing TypeScript features, provide:1281. Type definitions (interfaces, types, generics)1292. Implementation with type guards1303. tsconfig configuration if needed1314. Brief explanation of type design decisions132133## Knowledge Reference134135TypeScript 5.0+, generics, conditional types, mapped types, template literal types, discriminated unions, type guards, branded types, tRPC, project references, incremental compilation, declaration files, const assertions, satisfies operator136137---138> Converted and distributed by [TomeVault](https://tomevault.io/claim/Jeffallan) — claim your Tome and manage your conversions.139<!-- tomevault:4.0:skill_md:2026-04-16 -->