TypeScriptのジェネリクスが本当に意味わからなかった

typescriptbook.jp

上記リンクを中心に

2時間くらい頭をひねり、わかったようなわからないような気になっていた。

そのあと、仕事で使用しているNext.jsのソースコードを見たときに、急に理解できた(気がする)のでメモ代わりに自身の言葉で残しておく

 

そもそもジェネリクスとは、関数だけでなくクラスにも使用できるが、関数での使用をよく見るので関数でメモを残す

 

function chooseRandomly<T>(v1: T, v2: T): T {
return Math.random() <= 0.5 ? v1 : v2;
}
サバイバルTypeScruptに上記のような例がある。
<T>の部分はこの関数で使用する型を示している。
Tが型なので、v1、v2という引数にも同じ型が入ってきて、ついでに返り値の型を示すところにも「:T」とあるので、同じ型を返すことがわかる
 
これはTでもIでもAでもよくて、慣習的にTになっているだけらしい。TやUをよく見かけるが、それ自体に意味はなかったのだ。AやBでもいいのだ。
 
これがどういう時に効力を発揮するかというと、サバイバルTypeScriptで示されたような、引数の型に影響しない処理を行う場合も然り、
Next.jsでPageを返却するときに使用するメソッドにジェネリクスが使われており、自分はここでようやく理解した。
テンプレートは確かに、ユーザーが型を決めるのでテンプレート側でどんな情報をページに表示するのかわからない。想定もできないのだ。
なのでジェネリクスにしておいて、使用者側に型を作成させて定義させる
何度も同じような説明があったかもしれないが、
自分は実際に使われているソースコードを見て理解できたのでgithubやらを覗くのがいいのかもしれない。
 
物はついでに、いつも忘れるのでTypeScriptの型についてもうすこしメモをする
 
TypeScriptは自分で型を作成することができるが、基本となるstringなどは存在している
それはプリミティブ型と呼ばれ、いくつか種類がある
・boolean
・number(いつもintegerと書いてしまうのだった)
・string
・undifined
・null(型がない。型が未定義であるundifinedとは違うらしい)
・symbol
・bigint(numberには大きさ制限があるので、それを超えた数字を扱う)
 
シンボルってなんだ!と思って調べたところ、同じ値に見えてもシンボルを使うことで固有の値を持たせることができる?らしい。
使いどころがわからなかったが、デバッグに使うようなので、普段は使用しない。
 
また、undifinedとnullについてはサバイバルtypescriptの方で分かりやすく説明をしてもらっていた

undefinedとnullの違い | TypeScript入門『サバイバルTypeScript』

 

PHPとは意味合いが違ってくるうえ、typeof演算子ではnullはnullではなくobjectになるらしいので、あまり使わないほうが個人的にはいいように思う。