Angular NGXS:属性“stream$”在初始化之前使用

Angular NGXS:属性“stream$”在初始化之前使用,angular,typescript,ngxs,Angular,Typescript,Ngxs,乍一看,这似乎是角度组件生命周期逻辑的默认行为,因为组件属性尚未初始化,所以在组件初始化完成之前,stream$不能有赋值: @组成部分{ 选择器:“应用程序组件”, 模板:`应用程序工作!`, } 导出类AppComponent实现OnInit{ @选择AppState.getItems 流$:可观察的; firstItemStream$:Observable=this.stream$//此处发生错误 管 查找{itemId}=>itemId==0, ; ... 引自NgXs: 初始化NGXS

乍一看,这似乎是角度组件生命周期逻辑的默认行为,因为组件属性尚未初始化,所以在组件初始化完成之前,stream$不能有赋值:

@组成部分{ 选择器:“应用程序组件”, 模板:`应用程序工作!

`, } 导出类AppComponent实现OnInit{ @选择AppState.getItems 流$:可观察的; firstItemStream$:Observable=this.stream$//此处发生错误 管 查找{itemId}=>itemId==0, ; ... 引自NgXs:

初始化NGXS状态后解析APP_初始值设定项。它们由导入AppModule的NgxsModule初始化。解析APP_初始值设定项令牌之前,还会调用状态上的ngxsOnInit方法

上述代码按预期工作,但typescript错误仍然发生。是否有解决方法

我还决定不向typescript opensource项目提出问题,因为它可能与NgXs生命周期本身有关。

如果您想在.ts代码中使用stream$作为另一个源代码,则需要定义如下属性:

@Component({
  selector: 'app-component',
  template: `<p>app works!</p>`,
})
export class AppComponent implements OnInit {
  stream$: Observable<string[]>;
  firstItemStream$: Observable<{selectedItem: string}>;

  constructor(private readonly _store: Store) {
    this.stream$ = this.store.select(AppState.getItems);
    this.firstItemStream$ = this.stream$
      .pipe(
        find(({itemId}) => itemId === 0),
      );
  }
}
注意:我假设AppState.getItems是一个纯函数,它接收状态并返回给定的子状态

以下是。

如果要在.ts代码中使用stream$作为另一个源代码,则需要如下定义属性:

@Component({
  selector: 'app-component',
  template: `<p>app works!</p>`,
})
export class AppComponent implements OnInit {
  stream$: Observable<string[]>;
  firstItemStream$: Observable<{selectedItem: string}>;

  constructor(private readonly _store: Store) {
    this.stream$ = this.store.select(AppState.getItems);
    this.firstItemStream$ = this.stream$
      .pipe(
        find(({itemId}) => itemId === 0),
      );
  }
}
注意:我假设AppState.getItems是一个纯函数,它接收状态并返回给定的子状态

下面是。

这听起来像是使用selectdecorator的场景

因此,您需要将声明更新为:

@SelectAppState.getItems stream$!:Observable;

这听起来像是使用select decorator的场景

因此,您需要将声明更新为:


@SelectAppState.getItems stream$!:Observable;

是的,我知道。但为什么选择装饰器以传统方式工作?发生错误的原因是,当代码执行时,流$prop尚未初始化,因此在访问时会导致错误。链接的上面的示例显示了如果没有其他属性rel,如何使用装饰器是的,我知道。但是为什么选择decorator以传统方式工作呢?发生错误的原因是,当代码执行时,流$prop尚未初始化,因此在访问时会导致错误。上面链接的示例显示了在没有其他属性依赖decorator的情况下如何使用decorator。不清楚typescript错误是什么你看到了,但听起来像是这个场景。所以你需要将声明更新为@SelectAppState.getItems stream$!:Observable;@GarthMason你是对的。这是一个解决方法,但我认为它不是一个合格的类型脚本。尽管如此,它仍然是一个可接受的答案。你能不能也将你的提案作为答案发布,以便我可以将其作为一个正确的答案分配给你回答?当然,伙计,我不清楚你看到的是什么类型的脚本错误,但听起来像是这个场景。所以你需要将声明更新为@SelectAppState.getItems stream$!:Observable;@GarthMason你是对的。这是一个解决方法,但我认为它不是一个合格的类型脚本。不过,这是一个可以接受的答案。你也可以将您的建议作为答案,以便我可以指定为正确答案?当然,伙计,will doAlso此问题不会出现在typescript 4+的次要版本中,并且此问题不会出现在typescript 4的次要版本中+