
TypeScriptジェネリクスをサクッと理解【その4 複数のジェネリクスをつかう】
2024.3.16
この記事は約3分で読めます

筆者:三好アキ(専門用語なしでプログラミング)
▶︎ 三好アキの著書一覧はこちら
TypeScriptのジェネリクスはむずかしい?
この記事はジェネリクスをサクッと解説する全4回の記事の4つ目です
1 → TypeScriptジェネリクスをサクッと理解【その1 型定義に対して使うジェネリクス】
2 → TypeScriptジェネリクスをサクッと理解【その2 functionに対して使うジェネリクス】
3 → TypeScriptジェネリクスをサクッと理解【その3 型定義とfunction両方に対して使うジェネリクス】
*4(本記事)→ TypeScriptジェネリクスをサクッと理解【その4 複数のジェネリクスをつかう】
ジェネリクスを複数使う
次のコードがあったとします。
// main.ts
function example(a: string, b: string){
return [a, b]
}
console.log(
example("三島", "由紀夫")
)aとbの2つのデータをexampleに渡して実行後すると、aとbは[a, b]という配列になってreturnされます。
上の例では[三島, 由紀夫]とブラウザのコンソールに表示されます。
TypeScriptが推測してくれているので不要ですが、returnするデータの型を書いてみましょう。
配列のデータがreturnされるので、次のように書きます。
// main.ts
function example(a: string, b: string): [string, string]{ // 追加
return [a, b]
}
...さて、ここで次のようなデータを入れようとするとエラーが出ます。2005がnumber型だからです。
// main.ts
function example(a: string, b: string): [string, string]{
return [a, b]
}
console.log(
example("三島", "由紀夫")
)
// ⬇追加
console.log(
example(2005, "谷崎")
)
// ⬆追加どのような型のデータにもexamplefunctionが対応できるようにするために、ジェネリクスを使いましょう。
まず渡すデータを仮置きのTとKに変えます。
本連載1回目でも書きましたが、ここで使う文字は<ArgType>や<Name>など任意の文字も可です。
// main.ts
⬇変更
function example(a: T, b: K): [string, string]{
return [a, b]
}
...渡すデータの型が仮のものになったので、returnするデータの型も仮のものに変える必要があります。
// main.ts
⬇変更
function example(a: T, b: K): [T, K]{
return [a, b]
}
...最後に、このfunctionではジェネリクスを使っていると明示するコードを追加します。
// main.ts
⬇変更
function example<T, K>(a: T, b: K): [T, K]{
return [a, b]
}
...今回も型の推測によってこの時点でエラーは消えますが、次のように実際の型情報を注入する必要があるケースも存在します。
// main.ts
function example<T, K>(a: T, b: K): [T, K]{
return [a, b]
}
console.log(
example<string, string>("三島", "由紀夫") // 追加
)
console.log(
example<number, string>(2005, "谷崎") // 追加
)React + TypeScript開発においては、型定義に対するジェネリクスとfunctionに対するジェネリクスが同時に使われ、さらにジェネリクスの数も<T>のように1つだけでなく、<T, K, U>などと複数使われることがあります。
ジェネリクスはいつ使う? そして注意点は?
ジェネリクスが欠かせないのは、npmパッケージやライブラリの開発時です。
これらは多くの人が使うものであり、汎用的であることがマストなので、柔軟性を付与できるジェネリクスが活躍するのです。
しかし、ごく限られた人だけ、あるいは自分だけしか使わないファイルやReactコンポーネントにジェネリクスを過度に使うことは、むしろいたずらに抽象度を高め、時間が経って見返すと何をしているのか自分でもわからなくなってしまう可能性を高めます。
ジェネリクスを使うときはこの点に注意しましょう。

✤ 筆者 ✤
三好アキ(専門用語なしでプログラミング)
「専門用語なし」のメソッドで1,200人以上のビギナーをフロントエンド開発入門に成功させる。翔泳社『動かして学ぶ!Next.js/React開発入門』(韓国でも出版)など著書25冊以上。Amazonベストセラー1位複数回獲得。
React、Next.js、TypeScriptなどの最新情報や初心者向けコンテンツを、無料メルマガ配信中。メールアドレスだけで登録可 ▶︎ 無料メルマガ登録