如果Array.includes()结果类型是输入对象类型更紧密类型,则会出错。这个怎么办?这是一个例子。
index.d.ts
type OddNumberType = 1|3|5|7|9
type AllNumberType = OddNumberType|0|1|...|9
businessLogic.ts
let targetNumber:AllNumberType = parseInt(Math.random*10)
const oddArray:OddNumberType[] = [1,3,5,7,9]
let resultNumber:OddNumberType = 1;
if(oddArray.includes(targetNumber)){
resultNumber = targetNumber
}
TS问题
Type 'AllNumberType' is not assignable to type 'OddNumberType'.
Type 2 is not assignable to type 'OddNumberType'.ts(2322)
3条答案
按热度按时间xurqigkl1#
看起来你想使用
oddArray.includes
,就好像它是一个类型保护器,它接受一个任意的数字作为它的参数,如果它返回true
,那么Typescript应该将参数的类型缩小为OddNumberType
。Array.includes
方法没有像这样声明为类型保护,也不应该是:如果类型保护返回false
,这应该意味着参数不是它保护的类型,但通常如果某个类型T[]
的数组不包含元素,这并不意味着该元素不是T
类型。你的数组有一些特殊之处,这使得它的includes
方法在这个特定的情况下成为一个明智的类型保护--它不仅仅是一个OddNumberType
值的数组,它是一个 everyOddNumberType
值的数组。因此,我们可以声明一个类型
ArrayOfEveryOddNumber
,它与OddNumberType[]
相同,但它的includes
方法是一个类型保护:注意,还需要类型Assert
as ArrayOfEveryOddNumber
。Playground链接
vltsax252#
for循环是答案。array.find或array.includes不能在不同的in&out类型之间使用?
cbwuti443#
快速解决方法是添加
as
:如果
includes
的参数接受包含数组类型的任何类型,则会更好。