typescript-refactoring-patterns について
typescript-refactoring-patterns は、TypeScript のリファクタリングと型安全性に関するリファレンススキルです。型の絞り込み、バリアントのモデル化、ドメイン値の検証パターンを示します。
主な機能
- 01型ガードと判別可能なユニオン
- 02const アサーションとジェネリック制約
- 03ドメイン検証用のブランド型
- 04多態性による switch のリファクタリング
- 05安全でない型付けのコードスメル検出
活用シーン
- 01型アサーションを型ガードに置き換える
- 02相互排他的な状態をモデル化する
- 03ドメイン固有の文字列値を検証する
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ autohandai/ community-skills --skill typescript-refactoring-patternsインストール後、Claude Code で/typescript-refactoring-patternsを入力して読み込まれたか確認します。
詳細
TypeScript のリファクタリングパターン
基本原則
- 型アサーションよりも型の絞り込み -
asキャストの代わりに、型ガードと判別可能なユニオンを使用します - リテラルには const アサーション - 不変のリテラル型には
as constを使用します - ジェネリック制約 -
anyよりもextends制約を優先します - ブランド型 - ドメイン固有の検証にはブランド型を使用します
リファクタリングパターン
判別可能なユニオンを抽出する
複数のブールフラグがある場合は、判別可能なユニオンにリファクタリングします。
// Before
interface User {
isAdmin: boolean;
isGuest: boolean;
permissions?: string[];
}
// After
type User =
| { role: 'admin'; permissions: string[] }
| { role: 'guest' }
| { role: 'member'; permissions: string[] };
条件分岐をポリモーフィズムに置き換える
型に基づく switch 文がある場合は、ストラテジーパターンを使用します。
// Before
function process(item: Item) {
switch (item.type) {
case 'a': return processA(item);
case 'b': return processB(item);
}
}
// After
const processors: Record<ItemType, (item: Item) => Result> = {
a: processA,
b: processB,
};
const process = (item: Item) => processors[item.type](item);
型ガードを抽出する
型を絞り込む際は、再利用可能な型ガードを作成します。
function isNonNullable<T>(value: T): value is NonNullable<T> {
return value !== null && value !== undefined;
}
// Usage
const items = array.filter(isNonNullable);
検証にブランド型を使用する
ブランド型を使って、プリミティブ型への過度な依存を防ぎます。
type UserId = string & { readonly brand: unique symbol };
type Email = string & { readonly brand: unique symbol };
function createUserId(id: string): UserId {
if (!isValidUuid(id)) throw new Error('Invalid user ID');
return id as UserId;
}
コードの問題を見つけるポイント
次のパターンに注意し、リファクタリングします。
any型(unknownと型ガードに置き換えます)- 非 null アサーション
!(適切なチェックを追加します) - 型アサーション
as(型ガードを使用します) - オプショナルチェーンの過剰な使用
?.?.?.(データ構造を見直します) - 検証なしのインデックスシグネチャ
すぐにできる改善
- tsconfig で
strict: trueを有効にします - 型を拡大せずにチェックするには
satisfiesを使用します readonly配列とオブジェクトを優先します- 外部データには
unknownを使用し、境界で検証します
コメント
Markdown 対応