📘
TypeScript でもっと型安全に! 型引数で「サブタイプ」を表現する方法
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