【问题标题】:Is missing the following properties from type 'Observable<PizzaState>缺少来自类型 'Observable<PizzaState> 的以下属性
【发布时间】:2019-12-27 15:12:06
【问题描述】:

我尝试创建从商店收到但对此有红眼的比萨$。

this.pizzas$

我不知道为什么会这样,但是当我删除时 : Observable&lt;PizzaState&gt; 这是这个修复,但我想使用强类型我该如何修复它?

完整代码

import { Store } from '@ngrx/store';
import { ProductesState } from '../shared/models/productesState.model';
import { Observable } from 'rxjs';
import { PizzaState } from '../shared/models/pizzaState.model';

@Component({
  selector: 'app-read',
  templateUrl: './read.component.html',
  styleUrls: ['./read.component.css']
})
export class ReadComponent implements OnInit {

  public pizzas$: Observable<PizzaState>;

  constructor(private store: Store<ProductesState>) { }

  ngOnInit() {

    this.store.select('pizzas').subscribe(store => {
      this.pizzas$ = store;
    });

  }

}

我的减速器

import { PizzaState } from 'src/app/shared/models/pizzaState.model';
import * as fromPizzas from '../actions/pizzas.action'

export const initialState: PizzaState = {
    data: [],
    loaded: false,
    loading: false
}

export function reducer
    (state: PizzaState = initialState, action: fromPizzas.PizzasAction): PizzaState {

    switch (action.type) {

        case fromPizzas.LOAD_PIZZAS: {
            return {
                ...state,
                loading: true
            }
        }

        case fromPizzas.LOAD_PIZZAS_SUCCESS: {
            return {
                ...state,
                loaded: true,
                loading: false
            }
        }

        case fromPizzas.LOAD_PIZZAS_FAIL: {
            return {
                ...state,
                loaded: false,
                loading: false
            }
        }

        default: {
            return state;
        }

    }

}

和内部节点模块

    StoreModule.forRoot(
      { 'pizzas': reducers.pizzas }
    )

感谢您的帮助:-)

【问题讨论】:

  • 您正在选择存储状态(这是一个普通对象)并尝试将其分配给类型为 Observable&lt;PizzaState&gt;; 的变量,这是不正确的。也许你只想做pizzas$ = this.store.select('pizzas')

标签: angular typescript rxjs


【解决方案1】:

如果你想让它成为一个 Observable,你不应该订阅它,因为订阅会将它从 Observable 中解开。你有两个选择:


public pizzas$: PizzaState;
...
this.store.select('pizzas').subscribe(store => {
  this.pizzas$ = store;
});


public pizzas$: Observable<PizzaState>;
...
this.pizzas$ = this.store.select('pizzas');

【讨论】:

  • 有什么更好的方法?第二种方法对我不起作用,给我一个对象“Store {_isScalar: false, actionsObserver: ActionsSubject, reducerManager: ReducerManager, source: Store, operator: DistinctUntilChangedOperator}”并且不是 Observable
  • 取决于你如何使用它。如果您尝试在模板(.html 文件)中引用它。我将使用第二种方法,在 html 中您将其引用为 Pizzas$ |异步的。如果你想在你的打字稿中引用它,我会使用第一种方法,它将解开可观察对象,所以你只是在处理一个 PizzaState 对象。请记住,如果使用第一种方法,您需要担心在您的组件被销毁时取消订阅 observable。
  • 一般来说,如果可能的话,建议使用第二种方法。即使您在打字稿中使用它。它确实需要对 Observables 如何工作有一定的了解才能正确处理它。我需要有关您如何尝试使用它的背景信息才能真正提供建议。
  • 所以如果第二种方法更好,我会更喜欢它,但这给了我另一个对象。当我在减速器上打印时,这返回了正确的对象,但内部组件给了我另一个,可能是什么原因?
  • 当您使用选择器时,它会为您提供一个 observable,只要存储中的值发生变化,它就会发出值。它不会直接给你价值。有许多方法可以从中获得价值(最简单的是上面的选项 1,再次记住您需要取消订阅)。在不确切知道您要如何处理这些数据的情况下,我无法真正告诉您如何使用它。
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 2020-09-09
  • 2022-09-28
  • 2020-03-25
  • 2019-09-11
  • 2019-06-21
  • 2020-09-28
  • 2021-04-20
相关资源
最近更新 更多