【问题标题】:How to fix the issue not all the code paths return value?如何解决并非所有代码路径都返回值的问题?
【发布时间】:2018-12-28 23:37:22
【问题描述】:

我尝试解决的代码中有错误。我认为它需要一个return 语句,但我已经在forEach 循环之外,但它仍然抛出错误:

not all the code path return the value

如何修复以下代码?

main.ts:

private ValidateRequestArgs(str) {
  let ret: boolean = true;
  // here on val its throwing tslint error not all code paths return value 
  str.split(',').forEach((val) => {
    if (!ret) {
      return false;
    }
    if (List.indexOf(val) > -1) {
      ret = true;
    } else {
      ret = false;
    }
  });
  return ret;
}

【问题讨论】:

  • 不是 TS 用户,但我的猜测是 lint 在你的函数中检测到 return,所以它认为你的函数总是必须返回一些东西,但事实并非如此。如果在else 语句后添加return true; 会怎样?

标签: javascript typescript tslint


【解决方案1】:

我不知道为什么 tslint 会抱怨,但你可以把整个事情写得更优雅:

return str.split(",").every(el => List.includes(el));

或 ES6:

return str.split(",").every(el => List.indexOf(el) > -1);

【讨论】:

  • 我没有使用 ES2017,所以包含将是一个问题,还有其他解决方案吗?
  • @hussain 然后.indexOf(el) > -1
  • 非常感谢
【解决方案2】:

传递给 forEach 的函数体具有 any -> boolean 的隐式签名,因此 tslint 似乎希望您更静态地处理它并在所有代码路径上返回布尔值。

【讨论】:

    【解决方案3】:

    抱怨是第一个 if(){} 缺少带有 return 语句的 else{} 块。您可以在 tsconfig 文件设置中禁用此行为:

     "noImplicitReturns": false,
    

    当然你也可以加

    else {return ...}
    

    但我不建议这样做,因为 forEach 不应该返回任何内容,例如此处所述: What does `return` keyword mean inside `forEach` function? 或在这里: https://codeburst.io/javascript-map-vs-foreach-f38111822c0f

    最好完全摆脱第一个 if() 。干杯

    【讨论】:

      【解决方案4】:

      tsconfig.json

      compilerOptions:{
        "noImplicitReturns": false
      }
      

      【讨论】:

        【解决方案5】:

        您可以通过两种方式解决此错误。

        1. 通过将tsconfig.json 中的noImplicitReturns 属性编辑为false

          “noImplicitReturns”:假

        1. 通过为方法中的每个路径添加返回语句。如果你有 10 个 if 条件,那么你必须添加 10 个 return 语句。这看起来很奇怪,但 typescript 建议每条路径都返回。

        这里我们可以通过使用 lambda 表达式来避免路径的数量。

        private ValidateRequestArgs(str) {
          return str.split(",").every(el => List.includes(el));
        }
        

        【讨论】:

          【解决方案6】:

          尝试指定必须返回的函数,就我而言。

          【讨论】:

          • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
          【解决方案7】:

          如果 forEach 函数中有返回值,那么它会将函数识别为具有整个函数的返回类型。

          这样写你的循环没有问题:

          myFunction(): boolean {
              for (let item of items) {
                if (condition) {
                  return true;
                }
              }
              return false;
          }
          

          【讨论】:

          • 我没有意识到 foreach 循环中的return 只是从循环返回,而不是从外部函数返回。你的方法不那么令人困惑
          【解决方案8】:

          foreach 不需要返回任何东西;您必须从 foreach 中删除关键字“return”并进行编辑,错误指向此:

          private ValidateRequestArgs(str) {
            let ret: boolean = true;
            // here on val its throwing tslint error not all code paths return value 
            str.split(',').forEach((val) => {
              if (!ret) {
                ret = false // this correct
              }
              if (List.indexOf(val) > -1) {
                ret = true;
              } else {
                ret = false;
              }
            });
            return ret;
          }
          
          

          【讨论】:

            猜你喜欢
            • 2021-06-08
            • 2021-05-04
            • 1970-01-01
            • 2011-12-17
            • 1970-01-01
            • 2023-04-03
            • 2016-03-18
            相关资源
            最近更新 更多