为什么 Typescript 不让 BehaviorSubject 采用联合类型?

Dav*_*han 1 rxjs typescript

我相信这个问题纯粹是 Typescript 相关的,在我的例子中恰好涉及 BehaviorSubject。

我知道这两行:

    const myVariable: string | null = 'string';
Run Code Online (Sandbox Code Playgroud)

    const myVariable: string | null = null;
Run Code Online (Sandbox Code Playgroud)

是有效的语法。因此,我已经声明了这个 BehavoirSubject:

    const user: BehaviorSubject<User | null> = new BehaviorSubject(
      null
    );
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为此错误:

Type 'BehaviorSubject<null>' is not assignable to type 'BehaviorSubject<User | null>'.
  Types of property 'observers' are incompatible.
    Type 'Observer<null>[]' is not assignable to type 'Observer<User | null>[]'.
      Type 'Observer<null>' is not assignable to type 'Observer<User | null>'.
        Type 'User | null' is not assignable to type 'null'.
          Type 'User' is not assignable to type 'null'.ts(2322)
Run Code Online (Sandbox Code Playgroud)

我的期望是这个 BehaviorSubject 在这个例子中应该采用 User 或 null 类型,但它似乎只会同时接受这两种类型作为单一预期类型,因此这是一种解决方法:

const user: BehaviorSubject<User | null> = new BehaviorSubject(
    null as User | null
  );
Run Code Online (Sandbox Code Playgroud)

类型本身似乎无关紧要,“string | null”和“User | string”都抛出相同类型的错误,那么这种类型的输入实际上应该如何完成?我宁愿永远不必打字。

提前致谢 :)

H.B*_*.B. 5

通过不在构造函数中指定类型,泛型类型参数被推断为null,而不是User | null。变量 ( const user)的类型与此无关(赋值发生在值构造之后,并且只执行强制转换(如果有的话))。

明确指定的类型T

const user = new BehaviorSubject<User | null>(null);
Run Code Online (Sandbox Code Playgroud)

  • 该死,菜鸟错误。很好的解释,小伙子:) 谢谢 (2认同)