3

使用 typescript 使用 npm 包 'immutability-helper' 修改不可变状态,我遇到了一些奇怪的错误(至少现在是这样)。我可以设置一个对象但不能合并它。你能澄清一下为什么吗?

给定以下数据:

export enum NetworkState {
    Checking,
    UpdateAvailable,
    Downloading,
    UpdateDownloaded,
    UpToDate,
    Error
}

export class Update {
    public networkState: NetworkState = NetworkState.UpToDate;
    public progress: number = 1;
}

export class Updater {
    public client: Update = new Update();
    public games :Map<string, Update> = new Map<string, Update>();
}

我的目标是更新由他的密钥“gameKey”标识的游戏“更新”对象的“进度”值。如果不考虑不变性,解决方案将是:

updateGameProgress(state: Updater, payload: {gameKey: string, progress: number}){
   state.games.get(payload.gameKey).progress = payload.progress
}

具有不变性,我使用的解决方案是:

updateGameProgress(state: Updater, payload: {gameKey: string, progress: number}){
   update(state, {
        games: {
            [payload.gameKey]: {
                $set: {
                    networkState: state.games.get(payload.gameKey).networkState,
                    progress: payload.progress
                } 
            }
        }
    });
}

但我对这个解决方案并不满意,因为它迫使我为 Update 对象的每个成员提供一个值。更新只包含两个属性,所以这没什么大不了的,但如果我有 10 多个属性怎么办。不幸的是,我尝试使用 $merge 没有成功。下面的代码生成了一个编译错误,它没有让我知道出了什么问题。

updateGameProgress(state: Updater, payload: {gameKey: string, progress: number}){
   update(state, {
        games: {
            [payload.gameKey]: {
                $merge: {
                    progress: payload.progress
                } 
            }
        }
    });
}

编译错误:

'{ games: { [x: string]: { $merge: { progress: number; }; }; }; }' 不可分配给“Spec”类型的参数。输入'{游戏:{[x:字符串]:{$merge:{进度:数字;}; }; }; }' 不可分配给类型 '{ client?: Spec; 游戏?:规格,从不>;}'。
财产“游戏”的类型不兼容。输入 '{ [x: string]: { $merge: { progress: number; }; }; }' 不可分配给类型 'Spec,never>'。类型 '{ [x: string]: { $merge: { progress: number; 中缺少属性 '$apply' }; }; }' 但在类型 '{ $apply: (v: Map) => Map; 中是必需的 }'。

你能澄清为什么会产生这个编译错误吗?执行此合并的有效语法是什么?

谢谢

4

0 回答 0