Вы можете использовать условный тип Extarct
для извлечения соответствующего типа действия из объединения, а затем использовать запрос типа, чтобы получить тип свойства payload
:
type Actions = { type: "INIT", payload: { x: string }} | { type: "CLOSE", payload: { y: number }};
type ExtractPayload<T extends Actions["type"]> = Extract<Actions, {type: T }>['payload']
function doSomething<T extends Actions["type"]>(type: T, payload: ExtractPayload<T>) {
// ...
}
doSomething("INIT", { x: "" }) //ok
doSomething("INIT", { x: 1 }) //err
doSomething("CLOSE", { y: 1 }) //ok
doSomething("CLOSE", { y: "1"} ) //err