![](/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.