Вы можете создать «надуманный» условный дистрибутивный тип , чтобы иметь тип объединения с Task
для каждого ключа в Action
. Таким образом, вам не нужно устанавливать Task<"move"> | ... | Task<"other Action keys">
вручную:
type DesiredTasks = keyof Action extends infer I ? I extends keyof Action ? Task<I> : never : never
// type DesiredTasks = Task<"move"> | Task<"eat">
// same as { action: "move"; value: number; } | { action: "eat"; value: string; }
Почему бы не Task<keyof Action>
?
Все типы значений свойств объединены вместе, например, различимые типы объединений больше не будет работать:
type Tasks = Task<keyof Action> // {action: "move" | "eat"; value: string | number; }
declare const t1: Tasks
if (t1.action === "eat") t1.value // value: string | number, no good...
declare const t2: DesiredTasks
if (t2.action === "eat") t2.value // value: string ✔
Sample TS Playground