いつか忘れる自分に宛てて
ジェネリクスとは?
・型の抽象化に使われる
・クラス、関数の引数に対して使われる
例コード、というか、わからなかった会社のコード
※書き換えてあります
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> {
// ...
}
おわり
最後までお読みいただきありがとうございました
◯ジェネリクス
✗ジェネリック
✗ジェネリティスクス