我想有一個方法,將行動作為第一個引數,并根據第一個引數來決定有效載荷。
假設我有一個方法,如下所示:
我有一個方法。
async executeUpdateAction<K> (
action_type: K,
action_payload: TransferUpdateActions[K],
) {
if (action_type === TRANSFER_AVAILABLE_UPDATE_ACTIONS.CANCEL) {
return this.cancelTransfer(payload)。
}
if (action_type === TRANSFER_AVAILABLE_UPDATE_ACTIONS.HOLD) {
return this.holdTransfer(payload)。
}
...
}
這只是一個抽象,它根據動作型別呼叫了一個函式。
每個底層方法(即 cancelTransfer、holdTransfer)都有自己獨特的有效載荷要求。
例如,讓我們說holdTransfer需要以下引數:
介面 HoldPayload {
duration: string;
}
holdTransfer(payload: HoldPayload) {
...
}
在這種情況下,對于executeUpdateAction方法,如果第一個引數action_type等于 "hold",我希望型別自動完成,從而使payload被打造成HoldPayload。
最后,我有一個呼叫executeUpdateAction的包裝器,如下所示:
interface UpdateDto {
duration? : string, //payload argument required to execute "Hold" /span>
admin_id? : 數字 //執行 "取消 "所需的有效載荷引數。
}
update(payload: UpdateDTO) {
this.executeUpdateAction(payload)
}
因此,只要UpdateDTO的payload與Cancel或Hold Payload中的一個匹配,它就應該是型別安全的。
請告知。
uj5u.com熱心網友回復:
試試這個:
type Action = "cancel"| "hold" 。
型別 Payload = {
cancel: {
userId: string;
};
hold: {
userId: string;
duration: 數字。
amount: 數字。
};
};
function executeAction<T extends Action>(action: T, payload: Payload[T]) {
return;
}

看起來Typescript似乎無法縮小第二個引數的泛型。在這種情況下,你可以安全地鑄造你的有效載荷。
function executeAction<T extends Action> (action: T, payload: Payload[T]) {
if (action === "cancel"/span>) {
cancelTransfer(payload as Payload["cancel"] )。)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/307925.html
標籤:
上一篇: <preclass="lang-jss-code-block"><codeclass="hljslanguage-javascript"&g
