這是一個我按鍵保留功能的物件:
export const questSetHelper: { [key in QuestSetHelper]: (player: Player, payload: FlagGender | FlagOrigin | FlagAdventure) => void } = {
'setGender': setGender,
'setOriginCircumstance': setOriginCircumstance,
'setAdventureCircumstance': setAdventureCircumstance
}
我將它們保留為字串,以便于從前端到后端傳遞用于確定要運行哪個函式的字串進行處理。每個函式只處理一種有效載荷型別。
例如:
export const setOriginCircumstance = (player: Player, payload: FlagOrigin): void => {
if (player.quests['intro']?.flags)
player.quests['intro'].flags['origin_circumstance'] = payload
else
throw new Error('Quest: intro - failed setOriginCircumstance')
}
當所有這些都被輸入到 時string,我當然沒有型別錯誤,但我希望明確輸入這些函式引數中的每一個。
問題
顯然,每個函式最終都可以處理 的一種questSetHelper型別payload,但我想假設每個函式都會被正確呼叫并傳遞正確的型別(即FlagGender有效載荷將始終轉到setGender)。
有沒有更好的方法來輸入這個而不改變結構?
uj5u.com熱心網友回復:
我相信有兩種選擇:
依賴型別推斷
這是對您的代碼的一個小改動
export const setGender = (player: Player, payload: FlagGender): void => {}
export const setOriginCircumstance = (player: Player, payload: FlagOrigin): void => {}
export const setAdventureCircumstance = (player: Player, payload: FlagAdventure): void => {}
export const questSetHelper = {
'setGender': setGender,
'setOriginCircumstance': setOriginCircumstance,
'setAdventureCircumstance': setAdventureCircumstance
}
游樂場 - 推理
使用顯式型別確保所有 setter 都具有正確的型別
在這種方法中,您從定義QuestFlags. 之后,您可以在 Mapped Types 中使用Key Remapping來生成具有適當名稱的 setter:
interface QuestFlags {
gender: FlagGender
originCircumstance: FlagOrigin
adventureCircumstance: FlagAdventure
}
type QuestFlagsSetters = {
[K in keyof QuestFlags & string as `set${Capitalize<K>}`]: (player: Player, payload: QuestFlags[K]) => void
};
export const questSetHelper: QuestFlagsSetters = {
'setGender': setGender,
'setOriginCircumstance': setOriginCircumstance,
'setAdventureCircumstance': setAdventureCircumstance
}
Playground - 鍵重映射
我看到你使用蛇形大小寫屬性名稱,但使用駱駝大小寫設定器。這也很容易實作:
interface QuestFlags {
gender: FlagGender
origin_circumstance: FlagOrigin
adventure_circumstance: FlagAdventure
}
type SnakeCaseToPascalCase<S extends string> =
S extends `${infer FirstWord}_${infer Rest}` ?
`${Capitalize<Lowercase<FirstWord>>}${SnakeCaseToPascalCase<Rest>}` :
Capitalize<Lowercase<S>>;
type QuestFlagsSetters = {
[K in keyof QuestFlags & string as `set${SnakeCaseToPascalCase<K>}`]: (player: Player, payload: QuestFlags[K]) => void
};
export const questSetHelper: QuestFlagsSetters = {
'setGender': setGender,
'setOriginCircumstance': setOriginCircumstance,
'setAdventureCircumstance': setAdventureCircumstance
}
Playground - 使用snake_case 的鍵重映射更改為camelCase
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390797.html
