【发布时间】:2018-11-30 02:02:18
【问题描述】:
我注意到 TypeScript 有一些奇怪的地方。我有一个类型联合,其中包含一些数组类型(string[]、number[])和一些非数组类型(string、number)。如果我使用类型推断,一切都会按预期工作:
type bar = string | number | string[] | number[];
declare foo: bar;
if (Array.isArray(foo))
{
foo // string[] | number[]
}
else
{
foo // string | number
}
但是如果我想将类型直接限制为数组类型并使用类型交集,我会得到一些我没想到的东西:
declare foo: bar & any[];
// expected type: string[] | number[]
foo // (string & any[]) | (number & any[]) | (string[] & any[]) | (number[] & any[])
为什么会这样?string & any[] 不应该评估为never 和string[] & any[] 评估为string[]?
【问题讨论】:
-
您在
bar & any[]中没有类型保护,因此您的预期输出一开始就无法正常工作。 -
抱歉,我正在尝试使用
unknown而不是any(这也不起作用)并且意外地将它留在那里。我修复了链接,所以现在操场代码等同于我问题中的代码。但是,我不知道您在说什么类型的守卫。我的问题中唯一的类型保护是Array.isArray。 -
string和any[]具有共同的number类型的键。 -
@MadaraUchiha 如果我们谈论的是类型联合,而不是交集,这将是相关的。类型联合允许我只访问公共键,并且是一个比使用的两种类型都宽松的类型。类型交集意味着变量必须具有
string和any[]的所有属性。而且似乎没有任何方法可以在 JavaScript 中实现这一点。
标签: typescript