我有一个名为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)
请尝试第二个代码片段。