いつか忘れる自分に宛てて
ジェネリクスとは?
・型の抽象化に使われる
・クラス、関数の引数に対して使われる
例コード、というか、わからなかった会社のコード
※書き換えてあります
export class BaseEntity<
    T extends Record,
    U extends keyof T
> 
// 型パラメータの制約
extends EntityModel<T, U> {
    // ...
}
// クラスの継承
わかったこと
・extendsが3つ書いてあってややこしいけど、extends EntityModelこれはただのクラス継承
・型パラメータ: <T> のような形で指定する型の変数
・型パラメータはクラス名の横に記載するらしい
・ジェネリクス(generics): 型パラメータを使う機能全般
・ジェネリッククラス: 型パラメータを使うクラス
・T extends Record 第1引数の型はRecord
・U extends keyof T 第2引数の型は第1引数のプロパティのユニオン型
keyofの説明
疑問
・T extends RecordでTはRecodeのプロパティを完全に満たさないといけない?
→YES,追加のプロパティを持たせることは可能
親クラスの型パラメータを見てみました。
親クラス第1引数のDataTypeには子クラスの第1引数Recordが含まれていました。
export class EntityModel<T extends DataType, U extends keyof T> {
// ...
簡単に考えると子クラスで第1引数の型パラメータをA|B|Cとしていて、親クラスでは第1引数の型パラメータをA|B|C|D|E...(略)|Zってしてる感じでしょうか
・なんで引数に直接型定義を書かないの?
export class BaseEntity<
    T extends Record,
    U extends keyof T
> extends EntityModel<T, U> {
    // ...
}
おわり
最後までお読みいただきありがとうございました
◯ジェネリクス
✗ジェネリック
✗ジェネリティスクス






