0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

いつか忘れるジェネリクスについて

Posted at

いつか忘れる自分に宛てて

ジェネリクスとは?

・型の抽象化に使われる
・クラス、関数の引数に対して使われる

例コード、というか、わからなかった会社のコード
※書き換えてあります

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,Uって名前はなに?
スクリーンショット 2025-01-16 10.51.51.png
スクリーンショット 2025-01-16 10.52.09.png

・T extends RecordでTはRecodeのプロパティを完全に満たさないといけない?
→YES,追加のプロパティを持たせることは可能

EntityModel<T, U>はなに?
スクリーンショット 2025-01-16 11.40.39.png

親クラスの型パラメータを見てみました。
親クラス第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> {
    // ...
}

スクリーンショット 2025-01-16 12.13.35.png

スクリーンショット 2025-01-16 12.12.38.png

スクリーンショット 2025-01-16 12.12.59.png

おわり

最後までお読みいただきありがとうございました

◯ジェネリクス
✗ジェネリック
✗ジェネリティスクス

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?