immutability-helper: я могу $ установить элемент на карте, но не $ merge it, почему? Как я могу объединить это? - PullRequest
3 голосов
/ 09 января 2020

Использование машинописного текста для изменения неизменяемого состояния с помощью пакета 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; } '.

Можете ли вы объяснить, почему генерируется эта ошибка компиляции? И какой может быть правильный синтаксис для выполнения этого слияния?

Спасибо

...