typescript-best-practices
TypeScriptまたはJavaScriptファイル(.ts、.tsx、.js、tsconfig.json)の読み取りや編集を行う際に使用します。TypeScript/JavaScriptのベストプラクティスに沿ったコーディングをサポートするスキルです。
description の原文を見る
Use when reading or writing TypeScript or JavaScript files (.ts, .tsx, .js, tsconfig.json).
SKILL.md 本文
TypeScript ベストプラクティス
CLAUDE.md の型優先、関数型、エラーハンドリングパターンに従います。このスキルは言語固有の慣例のみをカバーします。
React ベストプラクティスと組み合わせる
React コンポーネント (.tsx、.jsx ファイル、または @react インポート) を操作する場合は、常にこのスキルと一緒に react-best-practices をロードしてください。このスキルは TypeScript の基礎をカバーしており、React 固有のパターン (エフェクト、フック、ref、コンポーネント設計) は専用の React スキルに記載されています。
不正な状態を表現できないようにする
型システムを使用して、コンパイル時に無効な状態を防止します。
相互排他的な状態の判別ユニオン:
// Good: 有効な組み合わせのみが可能
type RequestState<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; error: Error };
// Bad: { loading: true, error: Error } のような無効な組み合わせを許可
type RequestState<T> = {
loading: boolean;
data?: T;
error?: Error;
};
ドメインプリミティブのブランド型:
type UserId = string & { readonly __brand: 'UserId' };
type OrderId = string & { readonly __brand: 'OrderId' };
// コンパイラが期待される UserId の場所に OrderId を渡すことを防止
function getUser(id: UserId): Promise<User> { /* ... */ }
リテラルユニオンの const アサーション:
const ROLES = ['admin', 'user', 'guest'] as const;
type Role = typeof ROLES[number]; // 'admin' | 'user' | 'guest'
// 配列と型は自動的に同期を保つ
function isValidRole(role: string): role is Role {
return ROLES.includes(role as Role);
}
never チェックによる網羅的な switch:
type Status = "active" | "inactive";
function processStatus(status: Status): string {
switch (status) {
case "active":
return "processing";
case "inactive":
return "skipped";
default: {
const _exhaustive: never = status;
throw new Error(`unhandled status: ${_exhaustive}`);
}
}
}
Zod によるランタイム検証
- スキーマを単一の情報源として定義し、
z.infer<>で TypeScript 型を推論します。型とスキーマの重複を避けます。 - ユーザー入力に
safeParseを使用します (失敗が予想される場合)。信頼境界でparseを使用します (無効なデータはバグ)。 .extend()、.pick()、.omit()、.merge()でスキーマを組み合わせて DRY な定義を実現します。- パース時のデータ正規化に
.transform()を追加します (文字列をトリム、日付をパース)。
import { z } from "zod";
const UserSchema = z.object({
id: z.string().uuid(),
email: z.string().email(),
name: z.string().min(1),
createdAt: z.string().transform((s) => new Date(s)),
});
type User = z.infer<typeof UserSchema>;
// 信頼境界での厳格なパース — API コントラクト違反時に throw
export async function fetchUser(id: string): Promise<User> {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`fetch user ${id} failed: ${response.status}`);
}
return UserSchema.parse(await response.json());
}
// 呼び出し元がユーザー入力からの成功とエラーの両方を処理
const result = UserSchema.safeParse(formData);
if (!result.success) {
setErrors(result.error.flatten().fieldErrors);
return;
}
オプション: type-fest
TypeScript 組み込み機能を超える高度な型ユーティリティについては、type-fest を検討してください:
Opaque<T, Token>- 手動の& { __brand }パターンよりもクリーンなブランド型PartialDeep<T>- ネストされたオブジェクトの再帰的 partialReadonlyDeep<T>- 不変データの再帰的 readonlySetRequired<T, K>/SetOptional<T, K>- ターゲット指定フィールド修正Simplify<T>- IDE ツールチップの複雑なインターセクション型をフラット化
import type { Opaque, PartialDeep } from 'type-fest';
type UserId = Opaque<string, 'UserId'>;
type UserPatch = PartialDeep<User>;
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- 0xbigboss
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/0xbigboss/claude-code / ライセンス: Apache-2.0
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。