![](/img/trans.png)
[英]Refer to FormBuilder Members in a Strongly Typed list in Angular 8
[英]eslint or strongly typed warning when accessing static information from a list
最近遇到了 static 信息被意外覆蓋的問題。
我們有一個在線游戲,玩家可以從游戲模式列表中進行選擇。 所有相關設置都存儲在 static 類中,如下所示:
export class ModeClassic4PData extends BaseGameModeData {
premiumExpansionAccess = undefined
modeSetting = ModeSettingEnum.Base
extensionSetting = ExtensionSettingEnum.Players4
optionalGameMechanics = []
startingSettlementPlacements = [TileEnums.CornerBuildingTypes.Settlement, TileEnums.CornerBuildingTypes.Settlement]
name = 'Base'
active = true
comingSoon = false
defaultMap = MapSettingEnum.TutorialClassic4P
defaultPlayerCount = 4
}
當玩家選擇一種模式並開始游戲時,信息將從 static 列表中提取。
export class GameModeDataController {
static gameModeDataList: BaseGameModeData[] = [
new GameMode.ModeClassic4PData(), new GameMode.ModeClassicTutorial4PData(), new GameMode.ModeClassic6PData(), new GameMode.ModeClassic8PData(),
new GameMode.ModeSeafarersData(), new GameMode.ModeSeafarers6PData(),
new GameMode.ModeSuperHostPowersData(), new GameMode.ModeTwoVersusTwoData(), new GameMode.ModeCitiesAndKnightsData(), new GameMode.ModeMulticatanData(),
]
static getModeDataForMode(modeSetting: ModeSettingEnum): BaseGameModeData | undefined {
for(const gameModeData of GameModeDataController.gameModeDataList) {
if(gameModeData.modeSetting == modeSetting) return gameModeData
}
return undefined
}
}
我們遇到的問題是,在一種情況下,此信息被提取,用於啟動游戲變量,然后在游戲后期進行更改,而我們沒有建立它引用最初從該列表中提取的 static 成員的連接。
那么,是否有一種 linting 方法或強類型方法來防止意外更改列出的 static 成員?
現在我們已經采用了在拉出時只返回 object 的新實例的解決方案。 這樣,任何意外更改都不會影響不是最有效的 rest。
export function newInstanceOfObject<T extends object>(instance: T): T {
const newInstance = new (instance.constructor as { new (): T })()
return newInstance
}
static getModeDataForMode(modeSetting: ModeSettingEnum): BaseGameModeData | undefined {
for(const gameModeData of GameModeDataController.gameModeDataList) {
if(gameModeData.modeSetting == modeSetting) return newInstanceOfObject(gameModeData)
}
return undefined
}
不確定這是否回答了問題,但您可以將屬性 BaseGameMode 設置為readonly
以防止修改。
https://www.typescriptlang.org/docs/handbook/classes.html#readonly-modifier
或者使用 object 的ReadOnly
實用程序類型將其屬性設置為只讀(但它不會影響深度嵌套的字段)。
https://www.typescriptlang.org/docs/handbook/utility-types.html
這樣,如果客戶想要修改 object,他們就被迫復制它。
但是,如果客戶端要對 object 進行大量修改,則返回深層復制/克隆可能會更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.