使用 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; 中是必需的 }'。
你能澄清为什么会产生这个编译错误吗?执行此合并的有效语法是什么?
谢谢