Какова цель строгой типизации магазина в NgRx? - PullRequest
2 голосов
/ 07 марта 2020

CoreModule - это загруженный модуль, содержащий состояние, необходимое для запуска приложения.

import * as fromCore from './state/core.reducer';

@NgModule({
  ...
  imports: [
    StoreModule.forRoot({ core: fromCore.reducer }),

DocumentModule - это модуль с отложенной загрузкой.

import * as fromDocument from './state/document.reducer';

@NgModule({
  ...
  imports: [
    StoreModule.forFeature('document', fromDocument.reducer),

DocumentComponent внедряет хранилище.

import * as fromDocument from './state/document.reducer';

constructor(private store: Store<fromDocument.State>) { }

fromDocument.State расширяет состояние 'core'.

import * as fromCore from '../../core/state/core.reducer';

export interface State extends fromCore.State {
    document: DocumentState;
}

Этот подход, который я вижу, используется повсеместно, но я не вижу в этом никакой пользы. Когда я настроил его так, чтобы fromDocument.State не выходил изCore.State, я все равно мог получить доступ к «основной» части дерева состояний в DocumentComponent.

this.user$ = this.store.select(fromCore.getUser);

Путем внедрения хранилища в компонент I всегда иметь доступ к полному дереву состояний, независимо от того, как я печатаю хранилище. Так, какова цель строгой типизации магазина? Почему бы просто не использовать Store везде? Единственный способ, которым я взаимодействую с объектом store, - это store.select и store.dispatch, поэтому, насколько я вижу, преимущества при наборе текста нет?

1 Ответ

3 голосов
/ 07 марта 2020

Specifi c point

В указанном вами случае c типизация поможет с перегрузкой select, которая принимает в качестве аргумента функцию отображения, например, this.store.select(s => ....).

NgRx все же позволяет вам делать нетипизированный выбор, хотя. Связанное обсуждение на GitHub по этому поводу: https://github.com/ngrx/store/issues/60

В общем

Строгая типизация с помощью TypeScript и других необычных вещей (и, честно говоря, большинство функций всех языков программирования) ) не предназначены для

  • автоматической проверки для вашей программы
  • , выступающей в качестве некоторой функции безопасности (предотвратите утечку данных)

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

Пример: например, попытка вызвать user.namme вместо user.name в непонятной, забытой части кода, что приведет к каскаду ошибок. Представьте, что он показывает только некоторые «неопределенные» и «ошибки входа в систему» ​​пользователю в странном месте, и только если он выполняет 5 очень специфических c действий в определенном порядке, его немного сложно отследить и воспроизвести.

Это будет быстро обнаружено вашим компилятором перед запуском в эксплуатацию, если вы используете строгую типизацию.

...