如何解决不是所有代码路径 return 值的问题?

How to fix the issue not all the code paths return value?

我尝试解决的代码中有错误。我认为它需要一个 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;
}

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

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

或 ES6:

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

传递给 forEach 的函数体有一个隐含的签名 any -> boolean,因此 tslint 似乎希望您更静态地对待它,并在所有代码路径上使用 return 布尔值。

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

 "noImplicitReturns": false,

当然你也可以加上

else {return ...}

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

最好完全去掉第一个 if()。干杯

tsconfig.json

compilerOptions:{
  "noImplicitReturns": false
}

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

  1. 通过在 tsconfig.json

    中将 noImplicitReturns 属性编辑为 false

    "noImplicitReturns": false

  1. 通过为方法中的每个路径添加 return 语句。如果你有 10 个 if 条件,那么你必须添加 10 个 return 语句。这看起来很奇怪,但是打字稿建议对每条路径使用 return。

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

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

如果 forEach 函数中有一个 return,那么它会将该函数识别为具有整个函数的 return 类型。

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

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

foreach 不需要 return 任何东西;您必须从 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;
}