← Back to list

typescript-advanced-types
by jsmithdenverdev
OpenCode configuration
⭐ 0🍴 0📅 Jan 21, 2026
SKILL.md
name: typescript-advanced-types description: Advanced TypeScript patterns including generics, conditional types, mapped types, and type inference license: MIT compatibility: opencode metadata: category: language language: typescript level: advanced
What I do
I provide expertise in advanced TypeScript patterns and type system features:
- Generics & Constraints: Complex generic patterns with multiple type parameters and constraints
- Conditional Types: Type-level logic using conditional types and distributive conditional types
- Mapped Types: Transformation types using mapped types and key remapping
- Template Literal Types: String manipulation at the type level
- Utility Types: Custom utility types and advanced usage of built-in utilities
- Type Inference: Advanced inference patterns with
inferkeyword - Discriminated Unions: Type-safe state machines and exhaustive checking
- Brand Types: Nominal typing patterns for enhanced type safety
When to use me
Load this skill when you need to:
- Implement complex type-safe APIs or libraries
- Create reusable utility types
- Build type-safe state management
- Ensure exhaustive pattern matching
- Implement dependency injection with strong typing
- Create branded/nominal types for domain primitives
Best Practices
1. Dependency Injection Pattern
// Define service interfaces
interface Logger {
log(message: string): void;
}
interface Database {
query<T>(sql: string): Promise<T>;
}
// Use constructor injection
class UserService {
constructor(
private readonly logger: Logger,
private readonly db: Database
) {}
async findUser(id: string) {
this.logger.log(`Finding user ${id}`);
return this.db.query<User>(`SELECT * FROM users WHERE id = $1`);
}
}
2. Discriminated Unions for Type-Safe State
type AsyncData<T, E = Error> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; error: E };
function handleData<T>(data: AsyncData<T>) {
switch (data.status) {
case 'idle':
return 'No data yet';
case 'loading':
return 'Loading...';
case 'success':
return data.data; // TypeScript knows data exists here
case 'error':
return data.error.message; // TypeScript knows error exists here
}
}
3. Branded Types for Domain Primitives
type Brand<K, T> = K & { __brand: T };
type UserId = Brand<string, 'UserId'>;
type Email = Brand<string, 'Email'>;
const createUserId = (id: string): UserId => id as UserId;
const createEmail = (email: string): Email => {
if (!email.includes('@')) throw new Error('Invalid email');
return email as Email;
};
// This prevents mixing up primitives
function sendEmail(userId: UserId, email: Email) {
// userId and email are both strings, but can't be mixed up
}
4. Advanced Generics with Constraints
// Extract methods from a type
type Methods<T> = {
[K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
}[keyof T];
// Create a type-safe builder pattern
class Builder<T extends Record<string, any>> {
private data: Partial<T> = {};
set<K extends keyof T>(key: K, value: T[K]): Builder<T> {
this.data[key] = value;
return this;
}
build(): T {
return this.data as T;
}
}
Type Safety Principles
- Prefer
unknownoverany: Force explicit type checking - Use
readonlyby default: Immutability prevents bugs - Leverage
constassertions: For literal types and readonly tuples - Enable strict mode:
strict: truein tsconfig.json - Avoid type assertions: Use type guards instead
- Use discriminated unions: Instead of optional properties for state
Common Patterns
Result Type (Railway Oriented Programming)
type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E };
const divide = (a: number, b: number): Result<number> =>
b === 0
? { ok: false, error: new Error('Division by zero') }
: { ok: true, value: a / b };
Builder Pattern with Fluent API
interface Config {
host: string;
port: number;
ssl: boolean;
}
class ConfigBuilder {
private config: Partial<Config> = {};
host(host: string): this {
this.config.host = host;
return this;
}
port(port: number): this {
this.config.port = port;
return this;
}
ssl(enabled: boolean): this {
this.config.ssl = enabled;
return this;
}
build(): Config {
if (!this.config.host || !this.config.port) {
throw new Error('Missing required fields');
}
return this.config as Config;
}
}
References
- TypeScript Handbook: Advanced Types
- Effective TypeScript by Dan Vanderkam
- Type Challenges: github.com/type-challenges/type-challenges
Score
Total Score
50/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
Reviews
💬
Reviews coming soon