两个布尔值的打字稿元组被推断为布尔类型的数组

Posted

技术标签:

【中文标题】两个布尔值的打字稿元组被推断为布尔类型的数组【英文标题】:Typescript tuple of two booleans being inferred as an array of type boolean 【发布时间】:2017-12-07 01:31:23 【问题描述】:

我尝试将两个布尔值的元组放入我的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 v5.0.1的BehaviorSubject

【问题讨论】:

* 作为口味问题-在您给出的示例中-boolean[] 是一种合理的推断类型。您可以/应该将您的元组定义为类型/接口,恕我直言。 【参考方案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&lt;[false, false]&gt;

【讨论】:

【参考方案2】:

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

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

private someBehaviorSubject = new BehaviorSubject([false, false] as [boolean, boolean]);

【讨论】:

以上是关于两个布尔值的打字稿元组被推断为布尔类型的数组的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 基础类型

错误:类型不匹配:推断类型为单位,但应为布尔值

在元组中存储指向布尔值的指针

错误:类型不匹配:推断类型是字符串?但布尔值是预期的

如何在打字稿元组中使用扩展运算符?

c#中布尔值和布尔值的区别? [复制]