Angular strictPropertyInitialization-在哪里初始化成员?

Angular strictPropertyInitialization-在哪里初始化成员?,angular,typescript,Angular,Typescript,在组件初始化期间,我希望检索一些用户信息。 现在,在Angular strict模式下,我不确定在哪里加载这些数据 我可以想出3个选择。但是哪一个是正确的呢?或者还有其他可能性吗 #1在该选项中,服务方法将在初始化userInfo时直接调用 export class NavComponent implements OnInit { public userInfo$: Observable<LoggedInUser> = this.sessionService.getUserInf

在组件初始化期间,我希望检索一些用户信息。 现在,在Angular strict模式下,我不确定在哪里加载这些数据

我可以想出3个选择。但是哪一个是正确的呢?或者还有其他可能性吗

#1在该选项中,服务方法将在初始化userInfo时直接调用

export class NavComponent implements OnInit {
  public userInfo$: Observable<LoggedInUser> = this.sessionService.getUserInformation();

  constructor(private sessionService: SessionService) {}

  ngOnInit(): void {}
}
导出类NavComponent实现OnInit{
public userInfo$:Observable=this.sessionService.getUserInformation();
构造函数(私有sessionService:sessionService){}
ngOnInit():void{}
}
#2在我看来,最好将其输入构造函数,如下所示:

export class NavComponent implements OnInit {
  public isMobileMenuCollapsed = true;
  public userInfo$: Observable<LoggedInUser>;

  constructor(private sessionService: SessionService) {
    this.userInfo$ = this.sessionService.getUserInformation();
  }

  ngOnInit(): void {}
}
导出类NavComponent实现OnInit{
public ismobilelemenu=true;
public userInfo$:可见;
构造函数(专用会话服务:会话服务){
this.userInfo$=this.sessionService.getUserInformation();
}
ngOnInit():void{}
}
#3,而不是构造函数。但是对于这个解决方案,我还需要明确的赋值断言:

export class NavComponent implements OnInit {
  public isMobileMenuCollapsed = true;
  public userInfo$!: Observable<LoggedInUser>;

  constructor(private sessionService: SessionService) {
  }

ngOnInit(): void {
  this.userInfo$ = this.sessionService.getUserInformation();
}
导出类NavComponent实现OnInit{
public ismobilelemenu=true;
public userInfo$!:可见;
构造函数(专用会话服务:会话服务){
}
ngOnInit():void{
this.userInfo$=this.sessionService.getUserInformation();
}
}


我应该在代码中使用以下哪种可能性?

您真正的问题是什么?我猜这是关于使用异步管道时模板中的类型不匹配

您需要知道异步管道可能返回
null
不匹配不是因为您可以观察到,而是因为管道的结果

如何修复它

在元素或更高级别的元素上引入*ngIf并使用结果。由于*ngIf,数据类型不能再包含
null

TL;DR使用选项1

哪一个是正确的?

您是否仅在HTML模板中使用
userInfo$
? 那么这三种选择在理论上都应该有效

为什么?

因为模板代码在
ngOnInit
之后运行,所以
userInfo$
应该在这三个选项中都已初始化

哪一个更好?

#1和#2本质上是相同的,在这两种情况下,
userInfo$
正在构造函数中初始化。我更喜欢#1,因为它消除了代码中的冗余


#3稍有不同,因为初始化没有在构造函数中发生。因此,如果您在组件内部使用
userInfo$
(例如,在
ngOnChanges
中,它在
ngOnInit
之前被调用),这可能会引入一些微妙的错误。

回答得很好。是否存在1和2不起作用的情况?例如,在复杂的情况下,一些变量在构造函数调用后初始化?我可以想象@ViewChilds,它只能在ngOnInit或之后安全使用。对于这种情况,3是正确的方法吗?是的,在这种情况下,userInfo$将只在html模板中使用是的,完全正确。对于值在构造函数中不可用的情况,必须在值可用时进行初始化(
ngOnInit
ngAfterViewInit
ngAfterContentInit
)。即使在这些情况下,另一种选择是定义
主题
,然后根据主题定义可观察的
userInfo$
。我没有任何问题。我的异步管道按预期工作(正如您在上一句中提到的)。我的问题只是,这是正确的方法,因为在官方的angular文档/教程中,它没有得到适当的描述。