Typescriptのジェネリクスがバインドするタイミングとスコープ
Tags:
Created: 2022-07-11 16:41:46Updated: 2022-07-18 10:22:47
はじめに
Generics(ジェネリクス)は宣言する場所によって型がバインドされるタイミングとスコープが変わります。毎回どっちがどっちか忘れてしまうので備忘録です。
シグネチャの先頭にジェネリクスの宣言を書く
- 関数呼び出し時にジェネリクスに型がバインドされる
- 型推論が働く
- ジェネリクスのスコープは個々のシグネチャに限られる
type InferenceConverter = <T>(list: T[], operator: (item: T) => T) => T[];
const inferenceConverter: InferenceConverter = (list, operator) =>
list.map((item) => operator(item));
const result1 = inferenceConverter([1, 2, 3], (item) => item * 2);
const result2 = inferenceConverter(
["a", "b", "c"],
(item) => `prefix-${item}`
);
Type名の後ろにジェネリクスの宣言を書く
- 関数の定義時にジェネリクスに型がバインドされる
- 関数の定義時にジェネリクスに渡す型を指定する必要がある
- ジェネリクスのスコープは型全体に及ぶ
type DeclarationConverter<T> = (list: T[], operator: (item: T) => T) => T[];
const numberConverter: DeclarationConverter<number> = (list, operator) =>
list.map((item) => operator(item));
const stringConverter: DeclarationConverter<string> = (list, operator) =>
list.map((item) => operator(item));
const result1 = numberConverter([1, 2, 3], (item) => item * 2);
const result2 = stringConverter(
["a", "b", "c"],
(item) => `prefix-${item}`
);