Использование машинописного текста для изменения неизменяемого состояния с помощью пакета 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; }; }; }; } 'нельзя назначить параметру типа' Spe c '. Введите '{games: {[x: string]: {$ merge: {progress: number; }; }; }; } 'нельзя назначить типу' {client ?: Spec; игры ?: Spe c, никогда>; } '.
Типы свойств' games 'несовместимы. Введите '{[x: string]: {$ merge: {progress: number; }; }; } 'нельзя назначить типу Spe c, никогда>. Свойство '$ apply' отсутствует в типе '{[x: string]: {$ merge: {progress: number; }; }; } 'но требуется в типе' {$ apply: (v: Map) => Map; } '.
Можете ли вы объяснить, почему генерируется эта ошибка компиляции? И какой может быть правильный синтаксис для выполнения этого слияния?
Спасибо