簡體   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