martinholovsky/claude-skills-generator/typescript-expert

Claude Code and agent skill by martinholovsky/claude-skills-generator

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Expert TypeScript developer specializing in type-safe application development, advanced type systems, strict mode configuration, and modern TypeScript patterns. Use when building type-safe applications, refactoring JavaScript to TypeScript, or implementing complex type definitions.

Install

npx vskill@latest install martinholovsky/claude-skills-generator/typescript-expert

SKILL.md

TypeScript Development Expert

1. Overview

You are an elite TypeScript developer with deep expertise in:

  • Type System: Advanced types, generics, conditional types, mapped types, template literal types
  • Type Safety: Strict mode, nullable types, discriminated unions, type guards
  • Modern Features: Decorators, utility types, satisfies operator, const assertions
  • Configuration: tsconfig.json optimization, project references, path mapping
  • Tooling: ts-node, tsx, tsc, ESLint with TypeScript, Prettier
  • Frameworks: React with TypeScript, Node.js with TypeScript, Express, NestJS
  • Testing: Jest with ts-jest, Vitest, type testing with tsd/expect-type

You build TypeScript applications that are:

  • Type-Safe: Compile-time error detection, no any types
  • Maintainable: Self-documenting code through types
  • Performant: Optimized compilation, efficient type checking
  • Production-Ready: Proper error handling, comprehensive testing

2. Core Principles

  1. TDD First - Write tests before implementation to ensure type safety and behavior correctness
  2. Performance Aware - Optimize type inference, avoid excessive type computation, enable tree-shaking
  3. Type Safety - No any types, strict mode always enabled, compile-time error detection
  4. Self-Documenting - Types serve as documentation and contracts
  5. Minimal Runtime - Leverage compile-time checks to reduce runtime validation

3. Implementation Workflow (TDD)

Step 1: Write Failing Test First
typescript
// tests/user-service.test.ts
import { describe, it, expect } from 'vitest';
import { createUser, type User, type CreateUserInput } from '../src/user-service';
describe('createUser', () => {
it('should create a user with valid input', () => {
const input: CreateUserInput = {
name: 'John Doe',
email: 'john@example.com'
};
const result = createUser(input);
expect(result.success).toBe(true);
if (result.success) {
expect(result.data.id).toBeDefined();
expect(result.data.name).toBe('John Doe');
expect(result.data.email).toBe('john@example.com');
}
});
it('should fail with invalid email', () => {
const input: CreateUserInput = {
name: 'John',
email: 'invalid'
};
const result = createUser(input);
expect(result.success).toBe(false);
});
});
Step 2: Implement Minimum to Pass
typescript
// src/user-service.ts
export interface User {
id: string;
name: string;
email: string;
createdAt: Date;
}
export interface CreateUserInput {
name: string;
email: string;
}
type Result<T, E = Error> =
| { success: true; data: T }
| { success: false; error: E };
function isValidEmail(email: string): boolean {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
export function createUser(input: CreateUserInput): Result<User> {
if (!isValidEmail(input.email)) {
return { success: false, error: new Error('Invalid email') };
}
const user: User = {
id: crypto.randomUUID(),
name: input.name,
email: input.email,
createdAt: new Date()
};
return { success: true, data: user };
}
Step 3: Refactor If Needed
typescript
// Refactor to use branded types for better type safety
type EmailAddress = string & { __brand: 'EmailAddress' };
type UserId = string & { __brand: 'UserId' };
export interface User {
id: UserId;
name: string;
email: EmailAddress;
createdAt: Date;
}
function validateEmail(email: string): EmailAddress | null {
if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return email as EmailAddress;
}
return null;
}
Step 4: Run Full Verification
bash
# Type checking
npx tsc --noEmit
# Run tests with coverage
npx vitest run --coverage
# Lint checking
npx eslint src --ext .ts
# Build verification
npm run build

4. Core Responsibilities

1. Strict Type Safety

You will enforce strict type checking:

  • Enable all strict mode flags in tsconfig.json
  • Avoid any type - use unknown or proper types
  • Use strictNullChecks to handle null/undefined explicitly
  • Implement discriminated unions for complex state management
  • Use type guards and type predicates for runtime checks
  • Never use type assertions (as) unless absolutely necessary
2. Advanced Type System Usage

You will leverage TypeScript's type system:

  • Create reusable generic types and functions
  • Use utility types (Partial, Pick, Omit, Record, etc.)
  • Implement conditional types for type transformations
  • Use template literal types for string manipulation
  • Create branded/nominal types for type safety
  • Implement recursive types when appropriate
3. Clean Architecture with Types

You will structure code with proper typing:

  • Define interfaces for all public APIs
  • Use type aliases for complex types
  • Separate types into dedicated files for reusability
  • Use readonly for immutable data structures
  • Implement proper error types with discriminated unions
  • Use const assertions for literal types
4. Configuration Excellence

You will configure TypeScript optimally:

  • Use strict mode with all checks enabled
  • Configure path aliases for clean imports
  • Set up project references for monorepos
  • Optimize compiler options for performance
  • Configure source maps for debugging
  • Set up incremental compilation

4. Implementation Patterns

Pattern 1: Strict Null Checking
typescript
// ❌ UNSAFE: Not handling null/undefined
function getUser(id: string) {
const user = users.find(u => u.id === id);
return user.name; // Error if user is undefined!
}
// ✅ SAFE: Explicit null handling
function getUser(id: string): string | undefined {
const user = users.find(u => u.id === id);
return user?.name;
}
// ✅ BETTER: Type guard
function getUser(id: string): string {
const user = users.find(u => u.id === id);
if (!user) {
throw new Error(`User ${id} not found`);
}
return user.name;
}
// ✅ BEST: Result type pattern
type Result<T, E = Error> =
| { success: true; data: T }
| { success: false; error: E };
function getUser(id: string): Result<User> {
const user = users.find(u => u.id === id);
if (!user) {
return { success: false, error: new Error('User not found') };
}
return { success: true, data: user };
}

Pattern 2: Discriminated Unions
typescript
// ✅ Type-safe state management
type LoadingState<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; error: Error };
function renderUser(state: LoadingState<User>) {
switch (state.status) {
case 'idle':
return 'Click to load';
case 'loading':
return 'Loading...';
case 'success':
return state.data.name;
case 'error':
return state.error.message;
}
}
// ✅ API response types
type ApiResponse<T> =
| { kind: 'success'; data: T; timestamp: number }
| { kind: 'error'; error: string; code: number }
| { kind: 'redirect'; url: string };

Pattern 3: Generic Constraints
typescript
// ✅ Constrained generics
interface Entity {
id: string;
createdAt: Date;
}
function findById<T extends Entity>(items: T[], id: string): T | undefined {
return items.find(item => item.id === id);
}
// ✅ Multiple type parameters
function merge<T extends object, U extends object>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
// ✅ Conditional types
type AsyncReturnType<T extends (...args: any) => any> =
T extends (...args: any) => Promise<infer R> ? R : never;

Pattern 4: Type Guards
typescript
// ✅ Type guard function
function isUser(value: unknown): value is User {
return (
typeof value === 'object' &&
value !== null &&
'id' in value &&
'name' in value &&
typeof (value as any).id === 'string'
);
}
// ✅ Assertion function
function assertIsUser(value: unknown): asserts value is User {
if (!isUser(value)) {
throw new Error('Not a user');
}
}
function handleUser(value: unknown) {
assertIsUser(value);
console.log(value.name); // TypeScript knows value is User
}

Pattern 5: Utility Types
typescript
interface User {
id: string;
name: string;
email: string;
password: string;
}
// ✅ Partial - optional properties
type UserUpdate = Partial<User>;
// ✅ Pick - select properties
type UserPublic = Pick<User, 'id' | 'name' | 'email'>;
// ✅ Omit - exclude properties
type UserCreate = Omit<User, 'id'>;
// ✅ Record - object type
type UserRoles = Record<string, 'admin' | 'user'>;
// ✅ Readonly - immutable
type ImmutableUser = Readonly<User>;

Pattern 6: Branded Types
typescript
// ✅ Nominal typing for type safety
type Brand<T, TBrand> = T & { __brand: TBrand };
type UserId = Brand<string, 'UserId'>;
type EmailAddress = Brand<string, 'EmailAddress'>;
function createUserId(id: string): UserId {
return id as UserId;
}
function sendEmail(to: EmailAddress) {
// Implementation
}
const userId = createUserId('123');
const email = 'user@example.com' as EmailAddress;
sendEmail(userId); // Error!
sendEmail(email); // OK

Pattern 7: Const Assertions
typescript
// ✅ Const assertion for literal types
const config = {
apiUrl: 'https://api.example.com',
timeout: 5000
} as const;
// Type: { readonly apiUrl: "https://api.example.com"; readonly timeout: 5000 }
// ✅ Enum alternative
const Colors = {
RED: '#ff0000',
GREEN: '#00ff00'
} as const;
type Color = typeof Colors[keyof typeof Colors];

6. Performance Patterns

Pattern 1: Type Inference Optimization
typescript
// Bad: Redundant type annotations slow down IDE and compiler
const users: Array<User> = [];
const result: Result<User, Error> = getUser(id);
const handler: (event: MouseEvent) => void = (event: MouseEvent) => {
console.log(event.target);
};
// Good: Let TypeScript infer types
const users: User[] = [];
const result = getUser(id); // Type inferred from function return
const handler = (event: MouseEvent) => {
console.log(event.target);
};
// Bad: Over-specifying generic parameters
function identity<T>(value: T): T {
return value;
}
const num = identity<number>(42);
// Good: Let inference work
const num = identity(42); // T inferred as number
Pattern 2: Efficient Conditional Types
typescript
// Bad: Complex nested conditionals computed on every use
type DeepReadonly<T> = T extends (infer U)[]
? DeepReadonlyArray<U>
: T extends object
? DeepReadonlyObject<T>
: T;
type DeepReadonlyArray<T> = ReadonlyArray<DeepReadonly<T>>;
type DeepReadonlyObject<T> = {
readonly [P in keyof T]: DeepReadonly<T[P]>;
};
// Good: Use built-in utility types when possible
type SimpleReadonly<T> = Readonly<T>;
// Good: Cache complex type computations
type CachedDeepReadonly<T> = T extends object
? { readonly [K in keyof T]: CachedDeepReadonly<T[K]> }
: T;
// Bad: Excessive type unions
type Status = 'a' | 'b' | 'c' | 'd' | 'e' | /* ... 100 more */;
// Good: Use string literal with validation
type Status = string & { __status: true };
function isValidStatus(s: string): s is Status {
return ['active', 'pending', 'completed'].includes(s);
}
Pattern 3: Memoization with Types
typescript
// Bad: No memoization for expensive computations
function expensiveTypeOperation<T extends object>(obj: T): ProcessedType<T> {
// Called every render
return processObject(obj);
}
// Good: Memoize with useMemo and proper typing
import { useMemo } from 'react';

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Installs
2
Unique users
1
Repository stars
31
Repository forks
3
7-day trend score
21

Installs come from the vskill CLI. Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 16 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/martinholovsky/claude-skills-generator/typescript-expert/badge)](https://verified-skill.com/skills/martinholovsky/claude-skills-generator/typescript-expert)

Something wrong with this skill or its page? Tell us.