TypeScript型継承早見表

型の継承に関してパターンが多くてわかりずらい。。
表にして理解を深めようと思います。


# クラスに関する型の適用と継承

| 状況         | キーワード    | 重要度 | 使用例                                        | 説明                               |
|--------------|----------------|--------|-----------------------------------------------|------------------------------------|
| クラスの型定義 | `class`        | ★★★★★ | `class MyClass {}`                            | クラスの定義                       |
| クラスの継承   | `extends`      | ★★★★★ | `class MyExtendedClass extends MyClass {}`    | 他のクラスを継承して新しいクラスを作成 |
| クラスの型適用 | `implements`   | ★★★★☆ | `class MyClass implements MyInterface {}`     | クラスにインターフェースの型を適用   |
| 抽象クラス     | `abstract`     | ★★★★☆ | `abstract class AbstractClass {}`             | インスタンス化できないクラス         |
| ミックスイン   | -              | ★★★☆☆ | `class MyClass extends Mixin(OtherClass) {}` | 複数のクラスからメソッドを取り込むためのパターン |

# インターフェースに関する型の適用と継承

| 状況                 | キーワード    | 重要度 | 使用例                                                     | 説明                               |
|----------------------|----------------|--------|------------------------------------------------------------|------------------------------------|
| インターフェースの定義 | `interface`    | ★★★★★ | `interface MyInterface {}`                                 | インターフェースの定義               |
| インターフェースの継承 | `extends`      | ★★★★☆ | `interface MyExtendedInterface extends MyInterface {}`     | 他のインターフェースを継承して新しいインターフェースを作成 |
| インターフェースの拡張 | `extends`      | ★★★★☆ | `interface MyInterface extends OtherInterface1, OtherInterface2 {}` | 複数のインターフェースを拡張して新しいインターフェースを作成 |

# type に関する型の適用と結合

| 状況             | キーワード    | 重要度 | 使用例                                                   | 説明                               |
|------------------|----------------|--------|----------------------------------------------------------|------------------------------------|
| 型エイリアスの定義 | `type`        | ★★★★★ | `type MyType = { a: string, b: number };`                | 特定の型に名前を付ける               |
| 型の合成         | `&`            | ★★★★☆ | `type Combined = TypeA & TypeB;`                         | 複数の型を合成して新しい型を作成     |
| ユニオン型       | `|`            | ★★★★☆ | `type MyUnion = TypeA | TypeB;`                          | 複数の型のうちいずれか一つを取れる型   |
| 条件付き型       | -              | ★★★☆☆ | `type Conditional<T> = T extends X ? TypeA : TypeB;`     | 条件に基づいて型を選択               |
| マップドタイプ     | -              | ★★★☆☆ | `type Mapped<Type> = { [Property in keyof Type]: NewType };` | オブジェクトの各プロパティに対して型を適用 |
| 型の抽出         | -              | ★★★☆☆ | `type Extracted = MyType['property'];`                   | オブジェクト型からプロパティの型を抽出 |

# 高度な使用例

| 状況             | キーワード    | 重要度 | 使用例                                                      | 説明                               |
|------------------|----------------|--------|-------------------------------------------------------------|------------------------------------|
| ジェネリック型   | -              | ★★★★☆ | `function identity<T>(arg: T): T { return arg; }`           | 汎用的な型を提供                     |
| ユニオン型       | `|`            | ★★★★☆ | `type MyType = string | number;`                             | 複数の型のいずれか一つを取れる型       |
| キーの抽出       | `keyof`        | ★★★☆☆ | `type MyKeys = keyof MyObject;`                              | オブジェクトのキーを抽出             |
| タプル型         | -              | ★★★☆☆ | `type MyTuple = [string, number];`                           | 固定された長さの配列とその要素の型   |
| ユーティリティ型 | -              | ★★★☆☆ | `type MyReadonly = Readonly<{ a: number, b: string }>;`     | 標準で提供される便利な型操作         |
| インターセクション型 | `&`            | ★★★☆☆ | `type MyType = A & B;`                                       | 複数の型のプロパティをすべて持つ型   |
| テンプレートリテラル型 | -              | ★★★☆☆ | `type World = "world"; type Greeting = hello ${World};`    | 文字列リテラル型の組み合わせ         |
| 条件付き型       | -              | ★★★☆☆ | `type IsString<T> = T extends string ? true : false;`       | 型に基づいた条件分岐                 |
| マップドタイプ     | -              | ★★★☆☆ | `type Optional<T> = { [K in keyof T]?: T[K] };`             | オブジェクトの各プロパティを操作     |
| 型の抽出         | -              | ★★★☆☆ | `type MyType = MyObject['myKey'];`                          | オブジェクトのプロパティの型を抽出   |
| 型のフィルタリング | -              | ★★★☆☆ | `type NonFunctionProps<T> = { [K in keyof T]: T[K] extends Function ? never : T[K] };` | 特定の型を除外                       |