繁体   English   中英

访问列表中的 static 信息时发出 eslint 或强类型警告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM