typescript TS错误:有签名,但这些签名都不兼容

xoefb8l8  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(195)

我在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上的代码链接。
我不知道是什么原因导致这个错误或如何解决它。任何指导将不胜感激。

ar7v8xwq

ar7v8xwq1#

你的检查const isArrayOfString = Array.isArray(data)实际上并不检查数组的内容是否是字符串,它也不能作为type narrowdata的一种方式工作。
.every拒绝像代码中那样工作,因为TS无法确定数组是包含字符串的数组还是包含键为a的对象的数组。
介绍工作型防护装置:

type Data = Array<string> | Array<{ a: boolean }>

const data = ["a", "b", "c"]

const isArrayOfStrings = (data: Array<any>): data is Array<string> =>
  data.every((x) => typeof x === "string")

const fn = (data: Data) => {
  if (isArrayOfStrings(data)) {
    const a = data.every((x) => x)
  }
}
6vl6ewon

6vl6ewon2#

第一件事:
你的代码有一些明显的问题:
console.log(x),其中x不在范围内,
isArrayOfString甚至不检查它是否是字符串阵列(为此,例如可以使用Array.every),
最后,在作用域中有2个data变量(虽然被隐藏,但仍然如此)。
修正这些错误后,错误可能会变得更加清晰。乍一看,这可能是因为every函数无法分辨数组成员的类型(因此它应该使用哪种every实现)。

相关问题