【问题标题】:Typescript - Type 'string' is not assignable to type 'boolean'打字稿 - 类型“字符串”不可分配给类型“布尔”
【发布时间】:2020-02-07 07:34:16
【问题描述】:

我有以下打字稿代码:

const parentItem= this.links.find((link) => {
  return urlArr.find((urlWord) => {
    return !!(urlWord === link.route.split('./')[1])
  })
});

// link.route.split('./')[1] is a string
// urlWord is also a string
// urlArr is array of strings
// links is an array of objects

打字稿一直在抱怨:

.component.ts(11,59):错误 TS2322:类型“字符串”不可分配给类型“布尔”。

代码在 chrome 控制台中运行良好。

这可能看起来与question 相似,但即使在阅读之后我也无法弄清楚问题出在哪里。

【问题讨论】:

  • 尝试 .any 而不是 .find
  • 您好,我扩展了您的代码(功能相同),使其更易于阅读。希望没事
  • 您应该确保parentItem 接收到一个字符串:const parentItem: string = ...。在整个代码中实际添加预期类型可能是值得的,因为您将获得更接近实际问题的更有用的错误。很难说这里发生了什么,因为我们都不知道系统中已经布置了哪些实际类型。打字稿是关于做更少的假设。你要求我们在这里做一堆假设。
  • @JLF,似乎在他对find 的定义中,predicate 应该返回boolean 而不是unknown。
  • @Qwertiy 就是这样。 Array.prototype.find() 对于字符串数组返回一个字符串(或未定义)。 find 谓词必须返回一个布尔值,因此使用嵌套的 urlArr.find() 作为 links.find 谓词的返回值是无效的

标签: javascript angular typescript


【解决方案1】:

只需更新您的打字稿和/或打字。您的代码中有no any error

declare var links: { route: string }[]
declare var urlArr: string[]

const parentItem = links.find(link => urlArr.find(urlWord => urlWord === link.route.split('./')[1]));

在当前版本的 typescript 中将 find 方法定义为

(method) Array<string>.find(predicate: (value: string, index: number, obj: string[]) => unknown, thisArg?: any): string | undefined (+1 overload)

注意unknown 而不是boolean - 你可以返回任何你想要的东西。

但是由于您实际上不需要内部find 的结果(除非您可以找到一个空字符串),您可以使用some 来代替它。

【讨论】:

    【解决方案2】:

    如 cmets 中所述,我需要在 find 函数中返回一个布尔值。因此,执行以下操作确保内部查找的结果转换为布尔值。

    const parentItem= this.links.find((link) => {
      // convert to boolean
      return !!(urlArr.find((urlWord) => {
        return urlWord === link.route.split('./')[1]
      }));
    });
    

    上面的代码现在返回一个匹配的链接对象或未定义的。

    【讨论】:

    • 您应该查看Array.prototype.some(),如Qwertiy's answer中所示
    • 您使用的是哪个版本的打字稿?
    • "typescript": "~3.2.2",
    猜你喜欢
    • 2016-10-25
    • 2017-12-28
    • 1970-01-01
    • 2022-01-17
    • 2021-11-10
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多