← Back to list

typescript-best-practices
by VdustR
⭐ 0🍴 0📅 Jan 23, 2026
SKILL.md
name: typescript-best-practices description: This skill should be used when the user asks to "review TypeScript code", "check my TS code", "review this TypeScript", "write TypeScript", or when writing, reviewing, or refactoring TypeScript code in projects with tsconfig.json or .ts/.tsx files. Provides dos and don'ts for type design, naming conventions, generics, and patterns.
TypeScript Best Practices
Guidelines for writing clean, type-safe, and maintainable TypeScript code.
Note: If the repository has established code style conventions, follow those first. These guidelines serve as defaults.
Core Principles
- Type-First Design - Define types before implementation; minimize reliance on inference
- Interface for Structure - Use
interfacefor objects,typefor unions/mapped/conditional - Namespace for Type Organization - Group related types with namespaces (types only, not runtime)
- Generic Const for Strictness - Use
<const TConfig>for strict literal inference - Extract, Don't Redefine - Get types from existing definitions instead of duplicating
- Strictest Config - Use strictest tsconfig base; install
ts-resetfor saner built-in types
Quick Reference
interface vs type
| Use | When |
|---|---|
interface | Object structures, class contracts, extensible APIs |
type | Union types, mapped types, conditional types, tuples |
Naming Conventions
| Element | Convention | Example |
|---|---|---|
| Interface/Type | PascalCase | UserProfile, ResponseData |
| Generic parameters | T prefix | TUser, TConfig (never bare T, K, V) |
| Acronyms | First cap only | userId, ApiResponse (NOT userID, APIResponse) |
| Constants | UPPER_SNAKE | MAX_RETRY_COUNT |
| Variables/Functions | camelCase | getUserById, isActive |
Array Syntax
| DO | DON'T |
|---|---|
Array<TItem> | TItem[] |
ReadonlyArray<TItem> | readonly TItem[] |
Object Types
| Use Case | DO | DON'T |
|---|---|---|
| Empty object | Record<string, never> | {} |
| Any object (extends) | Record<string, any> | Record<string, unknown> |
| Any object (annotation) | Record<string, unknown> | Record<string, any> |
| Non-primitive | object | {} |
Assertions
| DO | DON'T |
|---|---|
| Zod/arktype for runtime validation | response as User |
satisfies for compile-time checks | value as unknown as Type |
Type guards (if ('prop' in obj)) | as any to silence errors |
| Explicit null checks | x! non-null assertion |
Function Declarations
// DO: Type on the const
const myFunction: myFunction.Type = (options) => {
// implementation
};
// DO: satisfies when namespace doesn't exist
const onClick = ((event) => {
// implementation
}) satisfies React.ComponentProps<'button'>['onClick'];
Type Extraction
// DO: Extract from existing definitions
type OnClick = React.ComponentProps<'button'>['onClick'];
type ItemIds = Array<Item['id']>;
type TimeoutType = NonNullable<typeof config['timeout']>;
// DON'T: Manually redefine types
type BadItemIds = Array<number>; // Won't update if Item.id changes
Summary Checklist
Before committing TypeScript code, verify:
- Used
interfacefor object types,typefor unions/mapped/conditional - No
asor!assertions — use Zod,satisfies, type guards, or explicit null checks - Branded types use Zod
.brand()or type-festTagged(not manual casting) - Naming follows conventions (PascalCase types,
Tprefix for generics,IdnotID) - Types extracted from existing definitions where possible
- Functions use namespace pattern for complex type organization
- Arrow functions for const declarations
- Complex generics have type tests
Reference Files
For detailed patterns and examples, see:
- type-patterns.md - Type syntax, assertions, namespace pattern, generics
- code-style.md - Safe array access, early return, avoid destructuring, avoid enum
- union-exhaustive.md - Discriminated unions + exhaustive handling (e.g., for state, events, API responses)
- branded-types.md - Nominal types for ID/unit safety (e.g., UserId vs OrderId)
- template-literals.md - String pattern types (e.g., event names, CSS values, route parameters)
- type-testing.md - Type-level testing with
*.test-d.tsfiles - setup.md - tsconfig, strict options, ts-reset configuration
Notes
- These guidelines complement, not replace, project-specific conventions
- When in doubt, prioritize readability and maintainability
- Runtime type validation (zod, arktype) is recommended for external data
- Avoid over-engineering types; simple is better than clever
Score
Total Score
60/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+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