我現在已經來回瀏覽型別腳本檔案兩天了,試圖找到一種可行的方法來解決我試圖解決的這個問題。
我發現了一個非常簡潔的在線方法,關于如何在將引數傳遞給名為“getAction”的函式時實作型別安全,并且 vscode 非常好地讓我只能在“ActionA”和“ActionB”之間進行選擇,但是我正在嘗試解決的問題是選擇相應功能的確切型別。當需要通過有效負載發送時,這些不同的操作將不會具有相同的有效負載,我需要型別安全。
我解決這個問題的最遠的方法是將回傳型別作為泛型傳遞,但這很容易出錯,因為我可能將錯誤的回傳型別傳遞給我選擇的操作。
唯一正確的方法是以某種方式從回傳的函式中提取它。我嘗試了許多不同的方式,我提出使用 Extract<Type,Union> 的建議,在下面的代碼中,我硬編碼了“string | number”,但這需要用某種代碼替換從傳遞給 actionTypes 的 selected 屬性的引數中提取型別,該屬性始終是一個函式。( actionTypes["ActionA"] //returns (param: number)=>void)。我需要提取并作為預期輸入值傳入的引數的數字型別。
type Keys = keyof typeof actionMap
type actionTypes = typeof actionMap[Keys]
const actionA = (param: number) => {
//does some action A
console.log(param)
}
const actionB = (param: number) => {
//does some action B
console.log(param)
}
const actionMap = {
ActionA: actionA
ActionB: actionB
}
export class ActionFactory {
static getAction(key: Keys): Extract<(param: string | number) => void, actionTypes> {
return actionMap[key]
}
}
const newAction = ActionFactory.getAction('ActionA')
newAction('Some Payload')
我是鍵入腳本的新手,最近才開始,所以也許我完全沒有抓住重點,但任何潛在的解決方案對我來說都很有價值!
非常感謝你。
uj5u.com熱心網友回復:
您的問題有一個非常簡單的解決方案。如果您使用泛型型別來評估您提供給函式的鍵并使用它來獲取回傳值,那么打字稿將完全能夠提供型別安全。
const actionMap = {
ActionA: (param: number) => { },
ActionB: (param: string) => { }
};
export class ActionFactory {
static getAction<K extends keyof typeof actionMap>(key: K): typeof actionMap[K] {
return actionMap[key];
}
}
const newAction = ActionFactory.getAction('ActionA');
newAction('Some Payload'); // Error: Argument of type 'string' is not assignable to parameter of type 'number'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464406.html
