>Home

Typescriptのジェネリクスがバインドするタイミングとスコープ

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}`
);

参考文献

プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発