如果使用 null 作为默认值初始化,带有 Typescript 的 BehaviorSubject 会出错

Vat*_*sal 3 rxjs typescript angular

我有一个名为SelectedNodeInfoInterface的接口。我有一个 BehaviorSubject,我想用 null 初始化它,在某些操作完成后,或者调用方法时,我在其上传递新值 (.next(value))。它曾经工作正常,但我启用了

严格:真

在我的打字稿配置中,从那时起它开始给我错误。如果我禁用该标志,它将毫无问题地编译并按预期工作。但是,我想保持启用严格模式。

代码看起来像这样

export class SharedLinkedDetailsService {
selectedAccounts$: BehaviorSubject<SelectedNodeInfoInterface>;
constructor() {
  this.selectedAccounts$ = new BehaviorSubject(null);

 }

accountsSelected(selectedNode: SelectedNodeInfoInterface) {
  this.selectedAccounts$.next(selectedNode);
}

export interface SelectedNodeInfoInterface {
  selectedAccounts?: string | string[];
  highlightEdges?: boolean;
 }
Run Code Online (Sandbox Code Playgroud)

类型 'BehaviorSubject' 不可分配给类型 'BehaviorSubject'。

任何建议将不胜感激。

see*_*per 15

尝试这个:

export class SharedLinkedDetailsService {
  selectedAccounts$: BehaviorSubject<SelectedAccountType | null>;
  constructor() {
    this.selectedAccounts$ = new BehaviorSubject<SelectedAccountType | null>(null);

  }

  accountsSelected(selectedNode: SelectedNodeInfoInterface) {
    this.selectedAccounts$.next(selectedNode);
  }
Run Code Online (Sandbox Code Playgroud)

严格模式的要点是不允许空类型和未定义类型作为已定义类型的替代。因此,在这种情况下,如果您定义的类型的值也可能为 null 或未定义,则必须明确声明这种可能性。管道告诉打字稿类型可能是SelectedAccountTypenull。我希望这能说清楚!

  • 添加了解释 - 请注意,在调用构造函数时我不是“强制转换”。我提供一个通用参数来告诉打字稿该类使用的类型可以是 null 或 SelectedNodeInfoInterface。 (2认同)

Tee*_*ebo 0

我会这样做

selectedAccounts = new BehaviorSubject(null);
Run Code Online (Sandbox Code Playgroud)

在构造函数之外,第二种方法如下所示。我不确定像下面这样输入是否有效

selectedAccounts = new BehaviorSubject<TheTypeHere>(InitialValueOfType)
Run Code Online (Sandbox Code Playgroud)

请尝试第二个代码片段。