Действие не имеет полезной нагрузки в @ ngrx / store

У меня есть приложение Angular, разработанное в Angular 2 и ngrx / store1 или 2 (у меня нет package.json или node_moduels). Я пытаюсь настроить это приложение в Angular 5 и ngrx / store 5.1.0. Как и ожидалось, в последней версии чего-то нет. Одним из важных моментов, когда это не работает, является то, что у Action нет полезной нагрузки. Если я создаю экземпляр Action с полезной нагрузкой, он возвращает: «Ошибка TS2339: свойство 'payload' не существует для типа 'Action';» Я следил за кодом действия в библиотеке ngrx / store, собственно, интерфейс действия определен следующим образом.

export interface Action {
    type: string;
}

Я много искал в Интернете о новом ngrx / store, однако мне не удалось найти ответа, есть ли у кого-нибудь информация об этом?


person Anna Lee    schedule 21.02.2018    source источник


Ответы (3)


фактически он был удален из новых версий ngrx/store. но есть несколько способов развернуть его самостоятельно. проверьте эту проблему с github, люди придумали разные полезные решения.

При этом мое любимое решение - это расширение этого Action интерфейса на новый общий интерфейс, подобный этому:

export interface NewAction<T> extends Action {
    type: string;
    payload: T;
}

а затем вы можете использовать его как:

ExampleAction: NewAction<boolean> = {
    type: 'myType',
    payload: true
};
person GHB    schedule 21.02.2018
comment
Я действительно не знаю, почему полезная нагрузка была удалена, если разработчик должен переопределить вот так .... Я действительно не понимаю этого ... - person Anna Lee; 22.02.2018
comment
@AnnaLee, если вы проверите документы по миграции: github.com/ngrx/platform/blob /master/MIGRATION.md, мол удалили из-за It was a source of type-safety issues, especially when used with @ngrx/effects. и также сказано, что это была проблема, когда какое-то действие не нуждалось в полезной нагрузке. но я лично думаю, что для этих проблем было много других решений; и, по крайней мере, они могли бы реализовать один из этих способов включения полезной нагрузки в действия (например, универсальный тип). так что полное его удаление мне тоже не показалось разумной идеей. но я реализовал это и сейчас работает на меня - person GHB; 24.02.2018

Ознакомьтесь с документами по миграции https://github.com/ngrx/platform/blob/master/MIGRATION.md

Они отмечают, что свойство полезной нагрузки интерфейса было удалено из Action, и вам необходимо привести действие к соответствующему типу, чтобы получить доступ к свойству payload.

person Barry Tormey    schedule 21.02.2018

К вашему действию можно добавить свойство полезной нагрузки.

Если ваше действие имеет полезную нагрузку:

export class ActionWithPayload implements Action {
   readonly type = 'Action With Payload';
   constructor(payload: string) {}
}
person Noumaan Shah    schedule 21.02.2018
comment
это неверно, не каждое действие должно объявлять свойство полезной нагрузки - person Jota.Toledo; 21.02.2018
comment
@ jota-toledo Я обновил свой ответ, чтобы показать только реализацию, использующую полезную нагрузку. - person Noumaan Shah; 23.02.2018