実現したいこと
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
を作る方法があればよいのですが、何かアイデアありませんでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/02/13 02:48