TypeScriptのユニオン型の判別キーからもとの型を推論する方法

実現したいこと

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の追加時にActionkeyフィールドとActionMapのキーの文字列をあわせて追加しなければならず、少し保守性が悪いように思えます。
本当ならば ActionMap の定義など使わず、一撃でActionTypeを作る方法があればよいのですが、何かアイデアありませんでしょうか。

コメントを投稿

0 コメント