実現したいこと
TypeScriptの型推論の話です。
フィールドを判別キーとしたユニオン型を定義したとき、そのキーからもとの型を推論する型を作りたいです。
例えば以下のような Action 型と、その判別キーの型 ActionKey 型があるとします。
typescript
1type ClickAction = {2 key: 'click';3 x: number;4 y: number;5}6type CopyAction = {7 key: 'copy';8 data: string;9}10type Action = ClickAction | CopyAction;11 12type ActionKey = Action['key'];
このとき、取りうるActionKeyによって本来の型を表す型 ActionType<ActionKey> を作りたいです。
typescript
1ActionType<'click'> // => ClickAction を表す2ActionType<'copy'> // =>CopyAction を表す
試したこと
以下のような定義の仕方で一応実現できているかと思います。
typescript
1type ClickAction = {2 key: 'click';3 x: number;4 y: number;5}6type CopyAction = {7 key: 'copy';8 data: string;9}10type ActionMap = {11 click: ClickAction;12 copy: CopyAction;13}14type ActionKey = keyof ActionMap;15type Action = ActionMap[ActionKey];16type ActionType<T extends ActionKey> = ActionMap[T];
ただ、このやり方ではActionの追加時にActionのkeyフィールドとActionMapのキーの文字列をあわせて追加しなければならず、少し保守性が悪いように思えます。
本当ならば ActionMap の定義など使わず、一撃でActionTypeを作る方法があればよいのですが、何かアイデアありませんでしょうか。

0 コメント