BehaviorSubject with Typescript 如果初始化时以 null 作为默认值,则会出错



我有一个名为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;
 }
类型

"行为主体"不可分配给类型 "行为主体"。

任何建议将不胜感激。

试试这个:

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

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

试试这个: 设置类型的另一种方法

this.selectedAccounts$ = new BehaviorSubject({} as SelectedNodeInfoInterface);

您需要键入行为主题

this.selectedAccounts$ = new BehaviorSubject<SelectedNodeInfoInterface>(null);

this.selectedAccounts$ = new BehaviorSubject(null as SelectedNodeInfoInterface);

this.selectedAccounts$ = new BehaviorSubject(null) as BehaviorSubject<SelectedNodeInfoInterface>;

所有 3 个都可以工作,但我会选择数字 1。

就个人而言,我不会在构造函数中初始化它,而只是直接为属性分配一个新行为。

export class SharedLinkedDetailsService {
  selectedAccounts$ = new BehaviorSubject<SelectedNodeInfoInterface>(null);
  accountsSelected(selectedNode: SelectedNodeInfoInterface) {
    this.selectedAccounts$.next(selectedNode);
  }

我会这样做

selectedAccounts = new BehaviorSubject(null);

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

selectedAccounts = new BehaviorSubject<TheTypeHere>(InitialValueOfType)

请尝试第二个代码片段。

相关内容

最新更新