6

我尝试制作两个布尔值的元组放在我的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 的 BehaviorSubject5.0.1

4

2 回答 2

9

目前在 TypeScript 中使用元组有点棘手。数组字面量可能会意外地推断为数组类型而不是元组,这就是在这种情况下发生的情况。编译器new BehaviorSubject([false, false])过于急切地解析为 type 的对象BehaviorSubject<boolean[]>,而没有检查目标变量的类型。这是一个已知问题,许多相关问题已发布在问题跟踪器(#16391#15656和可能更多)中,并且已提出解决该问题的建议( # 10195 、#16656,...)。

对于推理失败的特定情况,您可能只需要求助于强制转换:

private someBehaviorSubject = new BehaviorSubject([false, false] as [boolean, boolean]);
于 2017-07-03T18:57:31.117 回答
1

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

于 2019-01-28T10:13:46.927 回答