Почему super () не может быть установлен на неизменяемую запись? - PullRequest
1 голос
/ 19 июня 2019

Я настраиваю действительно простое новое состояние хранилища Redux.

Я "клонировал" хранилище Redux, которое я создал ранее, и упростил его.Сначала я попробовал только в одном состоянии: редуктор, селектор и действие, затем я попытался создать дерево (как в моем старом проекте), но ничего не изменилось.Я проверил package.json и вижу, что у меня та же версия Redux, React, ReactRedux, Typescript, ecc ....

import { Record } from "immutable";

export enum officeLocations {
    cityOne = "CITYONE",
    cityTwo = "CITYTWO",
    none = "NONE",
    cityThree = "CITYTHREE",
    cityFour = "CITYFOUR"
}

export interface ILocationInfo {
    location: officeLocations;
}

const LocationInfoRecord = Record({
    location: officeLocations.none
});

export class LocationInfo extends LocationInfoRecord implements ILocationInfo {
    public location: officeLocations;

    constructor(props?: ILocationInfo) {
        // props ? super(props) : super(); <-- in older project I use this line instead of if-else... but here it tell me I cannot invoke super multiple times...
        if (props) {super(props);}
        else {super();}
        this.location = props ? props.location : officeLocations.none; // <- In my older code I don't need this line, for some reason it give me an error that location is not instantiated if I don't put this line
    }

    public with(values: Partial<ILocationInfo>) {
      return this.merge(values);
    }
}

Я ожидаю, что это работает без проблем ... ноTypescript не доставляет мне никаких проблем и не компилирует, но запускает его при «super ()», говоря «Ошибка: невозможно установить неизменную запись».

**

ОБНОВЛЕНИЕ:

**

Сегодня, ничего не меняя, он выдаст мне эту ошибку:

Тип '(location: LocationInfo, action: IAction) => Map'нельзя назначить типу «Редуктор, любой>».Типы параметров LocationInfo и state несовместимы.Тип 'Карта |undefined 'нельзя назначить типу' LocationInfo '.Тип 'undefined' нельзя назначить типу 'LocationInfo'

И теперь он дает мне эту ошибку даже с моим исходным кодом, который объясняется с комментариями к коду.

эта ошибка выдается, когда я вызываю «ОбъединениеReducers».

    const settingsReducer = combineReducers({
       location: locationReducer,
       other: otherReducer
    });

1 Ответ

0 голосов
/ 24 июня 2019

Record - фабрика, которая производит неизменные записи. Ваш код пытается назначить местоположение на самой фабрике, а не на выходе фабрики.

Типы записей более ограничены, чем типичные JavaScript классы. Они не используют конструктор класса, что также означает, что они не может использовать свойства класса (так как они технически являются частью конструктор).

Хотя типы записей могут быть синтаксически созданы с помощью JavaScript форма класса, результирующая функция Record на самом деле является фабрикой функция, а не конструктор класса.

TypeScript не так хорошо справляется с Immutable. Оба хотят иметь четкие определения структуры, но они делают это на другом уровне и по-другому, заставляя вас писать избыточный код.

Таким образом, свойство location предназначено только для TS, оно на самом деле не используется. Мы не должны пытаться присвоить ему что-либо, просто скажите TS, что это магически назначено:

public readonly location!: officeLocations

А затем удалить this.location = props ? props.location : officeLocations.none;

Если вы хотите по какой-то причине изменить входные данные, просто сделайте это в конструкторе и передайте все супер:

constructor(values = {}, name) {
    values.location = values.location || officeLocations.none;
    super(values, name);
}

Вот статья с описанием того, как использовать неизменяемые записи в TypeScript.

...