我尝试在我的BehaviorSubject
private someBehaviorSubject: BehaviorSubject<[boolean, boolean]> = new BehaviorSubject([false, false]);
但我收到编译错误说:
Type 'BehaviorSubject<boolean[]>' is not assignable to type 'BehaviorSubject<[boolean, boolean]>'
如何创建两个布尔值的元组,并正确初始化BehaviorSubject?似乎认为[false, false]
的类型为boolean[]
,而不是索引为0的元组,索引1必须是布尔值。
打字稿版本:2.3.3
来自rxjs v 5.0.1
的行为主题
答案 0 :(得分:9)
在TypeScript中使用元组目前有点棘手。数组文字可能会被意外地推断为数组类型而不是元组,这就是在这种情况下发生的事情。编译器已经急切地将new BehaviorSubject([false, false])
解析为BehaviorSubject<boolean[]>
类型的对象,而不检查目标变量的类型。这是一个众所周知的问题,许多相关问题已发布在问题跟踪器中(#16391,#15656,可能还有更多),并已提出建议以解决此问题(#10195,{{3 },...)。
对于推理失败的特定情况,您可能只需要采用强制转换:
private someBehaviorSubject = new BehaviorSubject([false, false] as [boolean, boolean]);
答案 1 :(得分:0)
在TypeScript 3.4中引入了新的语法后,我们可以选择声明所谓的“ const context” 。这使我们可以轻松地将给定数组声明为不可变的(如“声明后不能更改”),从而允许编译器采用“窄”类型。
这样我们可以声明:
private someBehaviorSubject = new BehaviourSubject(<const> [false, false])
// notice the <const>, alternatively we could write "[false, false] as const"
并推断出正确的类型BehaviourSubject<[false, false]>