📘

TypeScript でもっと型安全に! 型引数で「サブタイプ」を表現する方法

2024/04/20に公開
type ItemSubType = 'foo' | 'bar' | 'baz';
type Item<T extends ItemSubType = ItemSubType> = {
  foo: { type: 'foo'; value: string };
  bar: { type: 'bar'; value: number};
  baz: { type: 'baz'; value: boolean};
}[T];

上記のコードは、 Item タイプのオブジェクトにいくつかのサブタイプがあることを表現しています。

例えば、foo サブタイプのオブジェクトは value パラメータに string の値を持ちますが、 bar サブタイプは number の値を持ちます。

Item 型はこの 3 つのサブタイプのうちのいずれかであることを表現します。
Item<'foo'> 型は Item 型のうちサブタイプ foo であることを表現します。
Item<'bar' | 'baz'> は、Item 型のうちサブタイプ bar または baz のいずれかであることを表現します。

type Item =
  | { type: 'foo'; value: string }
  | { type: 'bar'; value: number }
  | { type: 'baz'; value: boolean }

type Item<'foo'> = { type: 'foo'; value: string }

type Item<'bar' | 'baz'> =
  | { type: 'bar'; value: number }
  | { type: 'baz'; value: boolean }

Discussion