我在TypeScript代码中收到了一个类型错误,可以使用一些帮助来理解这个问题。我看到的错误消息是:具有签名,但这些签名彼此不兼容。
下面是我的代码:
type Data = Array<string> | Array<{ a: boolean }>
const data = ['a', 'b', 'c']
const fn = (data: Data) => {
const isArrayOfString = Array.isArray(data)
if (isArrayOfString) {
const a = data.every(x => x)
console.log(x)
}
}
下面是TypeScript Playground上的代码链接。
我不知道是什么原因导致这个错误或如何解决它。任何指导将不胜感激。
2条答案
按热度按时间ar7v8xwq1#
你的检查
const isArrayOfString = Array.isArray(data)
实际上并不检查数组的内容是否是字符串,它也不能作为type narrowdata
的一种方式工作。.every
拒绝像代码中那样工作,因为TS无法确定数组是包含字符串的数组还是包含键为a
的对象的数组。介绍工作型防护装置:
6vl6ewon2#
第一件事:
你的代码有一些明显的问题:
console.log(x)
,其中x不在范围内,isArrayOfString
甚至不检查它是否是字符串阵列(为此,例如可以使用Array.every
),最后,在作用域中有2个
data
变量(虽然被隐藏,但仍然如此)。修正这些错误后,错误可能会变得更加清晰。乍一看,这可能是因为
every
函数无法分辨数组成员的类型(因此它应该使用哪种every
实现)。