【问题标题】:Rewriting function in TypeScript在 TypeScript 中重写函数
【发布时间】:2022-11-26 18:17:14
【问题描述】:

我在 JavaScript 中有以下(工作)函数:

function solve(strArr) {
  return strArr.reduce(function ([x, y], curr) {
    switch (curr) {
      case 'up':    return [x, y + 1]
      case 'down':  return [x, y - 1]
      case 'left':  return [x - 1, y]
      case 'right': return [x + 1, y]
    }
  }, [0, 0])
}

我正在尝试使用 TypeScript 将其重写为:

function solve(strArr: string[]): number[] {
  return strArr.reduce(([x, y]: number[], curr: string) =>  {
    switch (curr) {
      case 'up': return [x, y + 1]
      case 'down': return [x, y - 1]
      case 'left': return [x - 1, y]
      case 'right': return [x + 1, y]
    }
  }, [0,0])
}

但我收到 Type 'string' is not assignable to type 'number[]'. 错误,我知道这是指累加器,但不知道如何解决。

根据Rajesh's suggestion,将strArr 的类型更改为any 可以解决问题,但是给它指定我在函数中使用的特定类型是行不通的;为什么?

【问题讨论】:

  • function solve(strArr : any ) { any 解决所有问题,但稍后尝试替换它
  • @RajeshKanna 是的,它解决了。以后再换是什么意思?
  • 由于 .reduce() 方法是通用的,它几乎接受所有具有长度属性的类型。所以你是安全的。但是为函数指定特定类型的参数可以帮助您充分利用 TypeScript 的强类型功能。
  • 如果你打算使用 TypeScript,使用打字稿- 指定参数类型和返回值。如果 strArr 不比 string[] 更具体,那么你的减速器没有总是返回number[](不应该是[number, number]吗?)
  • @RajeshKanna 编辑了问题以反映您的解决方案。仍然不明白为什么具体会引发错误...

标签: typescript


【解决方案1】:

您应该明确处理开关中的默认情况:

function solve(strArr:string[]) {
  return strArr.reduce(([x, y], curr) =>  {
    switch (curr) {
      case 'up': return [x, y + 1]
      case 'down': return [x, y - 1]
      case 'left': return [x - 1, y]
      case 'right': return [x + 1, y]
      // maybe throw an error instead
      default: return [x, y];
    }
  }, [0,0])
}

Playground example

【讨论】:

    【解决方案2】:

    您可以按照其他人的建议为您的开关添加默认情况。

    我会建议第二种解决方案,即为您的输入参数创建一个类型以缩小类型:

    type Direction = 'up' | 'down' | 'left' | 'right'
    
    function solve(strArr: Direction[]) {
      return strArr.reduce(([x, y], curr) =>  {
        switch (curr) {
          case 'up': return [x, y + 1]
          case 'down': return [x, y - 1]
          case 'left': return [x - 1, y]
          case 'right': return [x + 1, y]
        }
      }, [0,0])
    }
    

    Play

    【讨论】:

      【解决方案3】:

      因为您没有涵盖所有情况。

      将默认情况添加到开关

      default : return []

      【讨论】:

        猜你喜欢
        • 2014-10-22
        • 2022-07-30
        • 1970-01-01
        • 2019-11-10
        • 2022-11-04
        • 2017-07-26
        • 2012-10-24
        相关资源
        最近更新 更多