<< All versions
Skill v1.0.0
currentLLM-judged scan90/100regression-io/claude-config-plugins/patterns
──Details
PublishedOctober 21, 2026 at 10:36 AM
Content Hashsha256:14a5ed27c1e344d7...
Git SHAdd0978fbf9ae
──Files
Files (1 file, 2.7 KB)
SKILL.md2.7 KBactive
SKILL.md · 126 lines · 2.7 KB
version: "1.0.0" name: patterns description: TypeScript Patterns & Best Practices guidance
TypeScript Patterns & Best Practices
Error Handling
typescript
// Custom error classesclass AppError extends Error {constructor(message: string,public code: string,public statusCode: number = 500) {super(message);this.name = 'AppError';}}class NotFoundError extends AppError {constructor(resource: string) {super(`${resource} not found`, 'NOT_FOUND', 404);}}// Result type patterntype Result<T, E = Error> =| { success: true; data: T }| { success: false; error: E };function parseConfig(text: string): Result<Config> {try {return { success: true, data: JSON.parse(text) };} catch (e) {return { success: false, error: e as Error };}}
Async Patterns
typescript
// Async/await with proper error handlingasync function fetchUser(id: string): Promise<User> {const response = await fetch(`/api/users/${id}`);if (!response.ok) {throw new AppError('Failed to fetch user', 'FETCH_ERROR', response.status);}return response.json();}// Parallel executionconst [users, posts] = await Promise.all([fetchUsers(),fetchPosts()]);// With timeoutasync function withTimeout<T>(promise: Promise<T>,ms: number): Promise<T> {const timeout = new Promise<never>((_, reject) =>setTimeout(() => reject(new Error('Timeout')), ms));return Promise.race([promise, timeout]);}
Dependency Injection
typescript
interface Logger {info(message: string): void;error(message: string, error?: Error): void;}class UserService {constructor(private readonly db: Database,private readonly logger: Logger) {}async getUser(id: string): Promise<User | null> {this.logger.info(`Fetching user ${id}`);return this.db.users.findById(id);}}
Utility Types
typescript
// Partial - all props optionalfunction updateUser(id: string, updates: Partial<User>): Promise<User>// Pick/Omit - subset of propstype UserPreview = Pick<User, 'id' | 'name'>;type UserCreate = Omit<User, 'id' | 'createdAt'>;// Record - typed objectstype UserMap = Record<string, User>;// Required - remove optionaltype RequiredUser = Required<User>;
Testing
typescript
import { describe, it, expect, vi } from 'vitest';describe('UserService', () => {it('should fetch user by id', async () => {const mockDb = {users: { findById: vi.fn().mockResolvedValue({ id: '1', name: 'Test' }) }};const service = new UserService(mockDb as any, console);const user = await service.getUser('1');expect(user).toEqual({ id: '1', name: 'Test' });expect(mockDb.users.findById).toHaveBeenCalledWith('1');});});