【发布时间】:2019-06-19 19:01:35
【问题描述】:
编辑:根据要求,TypeScript 版本为 3.2.2
关于 StackOverflow 上的这个特定错误有很多问题和答案,但没有一个能令人满意地解释为什么会发生这种情况。
在我的理解中,如果我有这样的类型:
type Something = number[] | string[]
那么Something 可以是数字数组或任何字符串数组。无论数组的内容如何,它都应该具有filter 和map 之类的属性。但是如果我在函数中使用这种类型:
function doSomething(s: Something): void {
s.map()
}
然后抛出cannot invoke an expression....错误。
这很容易通过将Something 更改为:
type Something = (number | string)[]
现在 TypeScript 不会抱怨调用签名,但我不明白为什么。出于所有意图和目的,(number | string)[] 和 number[] | string[] 似乎与我相同。它可以是一个包含数字的数组,也可以是一个包含字符串的数组。在定义这样的类型时,调用签名似乎甚至不相关。
文档甚至说:
联合类型描述的值可以是多种类型之一。我们使用竖线 (|) 来分隔每种类型,所以 number |字符串 | boolean 是值的类型,可以是数字、字符串或布尔值。
还有:
如果一个值的类型为 A | B,我们只知道它有 A 和 B 都有的成员。
因此,即使从我在官方文档中看到的内容来看,number[] | string[] 和 (number | string)[] 的行为也应该相同。
这是一个错误吗?我错过了重点还是只是过于密集?我知道这对大多数人来说似乎无关紧要,但我真的很想理解这一点,所以我希望有人能提供一个体面的解释。
【问题讨论】:
-
This 似乎相关
标签: typescript