Typescript 从列表访问静态信息时出现eslint或强类型警告

Typescript 从列表访问静态信息时出现eslint或强类型警告,typescript,eslint,Typescript,Eslint,最近遇到了静态信息被意外覆盖的问题 我们有一个在线游戏,玩家可以从游戏模式列表中进行选择。所有相关设置都存储在如下所示的静态类中: export class ModeClassic4PData extends BaseGameModeData { premiumExpansionAccess = undefined modeSetting = ModeSettingEnum.Base extensionSetting = ExtensionSettingEnum.Play

最近遇到了静态信息被意外覆盖的问题

我们有一个在线游戏,玩家可以从游戏模式列表中进行选择。所有相关设置都存储在如下所示的静态类中:

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
}
当玩家选择模式并开始游戏时,信息从静态列表中提取


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
    }

}
我们遇到的问题是,在一个场景中,该信息被提取,用于启动游戏变量,然后在游戏中稍后进行更改,而我们没有建立连接,它引用的是最初从该列表中提取的静态成员

那么,有没有linting方法或强类型方法来防止意外更改列出的静态成员


现在,我们已经使用了一种解决方案,即在拉取对象时只返回对象的一个新实例。这样,任何意外的更改都不会影响其他不是最有效的更改

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
}
导出函数newInstanceFoObject(实例:T):T{
const newInstance=new(instance.constructor为{new():T})()
返回新实例
}
静态getModeDataForMode(modeSetting:ModeSettingEnum):BaseGameModeData |未定义{
用于(GameModeDataController.gameModeDataList的常量gameModeData){
如果(gameModeData.modeSetting==modeSetting)返回NewInstanceOffObject(gameModeData)
}
返回未定义
}

不确定这是否回答了问题,但您可以将属性BaseGameMode设置为
只读
,以防止修改

或者使用对象的
ReadOnly
实用程序类型将其属性设置为ReadOnly(但不影响深度嵌套的字段)

这样,如果客户机想要修改对象,就必须复制该对象


但是,如果客户机要对对象进行大量修改,只返回深度拷贝/克隆可能会更容易。

1。与say不同,术语“静态类型”术语“强类型”没有一致的含义,并且不清楚在这个问题中它是什么意思。2.为什么将类纯粹用作名称空间(仅限于静态成员)?3.为什么有一个函数可以创建实例构造函数的新实例?4.如果您正在修改某些内容,并且不希望它被“覆盖”,那么为什么要使用静态属性而不是实例属性?所有这些都毫无意义。请把它精简到一个最小的复制案例中,以显示您遇到的实际问题。@JaredSmith 1。这里我指的是在更改静态值时抛出错误或警告的能力。2.你有更好的建议吗。我们的问题的结构性解决方案也是可以接受的。我们有固定的游戏模式设置,我们希望根据玩家选择正确启动游戏。3.这正是我们找到的5s解决方案,能够快速实施。寻找更好的东西。4.我们不小心使它变异了。它从未打算被变异。我们试图找到一种方法来避免意外地再次这样做。这不是static的意思:static的意思是属于类而不是实例,而不是不可变的。静态成员是可变的。你想要这样的好吧,我不确定我要找的是什么专业术语。这里我指的是一个永远不会被改变的属性。不应更改技术术语为“不可变”,TS访问修饰符为“只读”。请参阅我在评论中添加的链接和下面的答案。至于类作为纯粹的名称空间,只需使用带有属性的常规对象文本,这不是Java。至于创建一个新的实例黑客,我需要更多的细节来给出更好的建议,但我会立即建议给你的实例一个克隆方法,也许?只有当您知道构造函数的参数(或者如果它不接受任何参数)时,该函数中的方法才能工作,但如果您知道可以直接调用它,readonly在数组和对象之类的对象中工作吗?可能吧not@Esqarrouth它只适用于一层深度,对于嵌套较深的对象,也许这个答案有帮助: