两个布尔值的Typescript元组被推断为boolean类型的数组

时间:2017-07-03 17:40:23

标签: typescript tuples rxjs behaviorsubject

我尝试在我的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的行为主题

2 个答案:

答案 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更新:

在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]>