typescript 如何解决不是所有代码路径都返回值的问题?

uyto3xhc  于 2022-12-14  发布在  TypeScript
关注(0)|答案(8)|浏览(1136)

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

vcudknz31#

抱怨是第一个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()完全去掉。干杯

6psbrbz9

6psbrbz92#

tsconfig.json

compilerOptions:{
  "noImplicitReturns": false
}
50pmv0ei

50pmv0ei3#

可以通过两种方法解决此错误。
1.通过将tsconfig.json中的noImplicitReturns属性编辑为false

“无隐式返回”:错误

1.通过为方法中的每个路径添加一个return语句。如果你有10个if条件,那么你必须添加10个return语句。这看起来很奇怪,但是typescript建议为每个路径都添加return语句。
这里我们可以通过使用lambda表达式来避免路径数。

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

3z6pesqy4#

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

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

或ES6:

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

wrrgggsh5#

如果forEach函数中有返回值,则它会将该函数识别为具有整个函数的返回类型。
这样编写循环没有问题:

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

wmvff8tz6#

foreach不需要返回任何东西;必须从foreach和edit中删除关键字'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;
}
0s0u357o

0s0u357o7#

您可以定义函数的传回值,如下所示:

functionName: (variableName: string): string | void => {
    if (variableName === "a") {
        return "link";
    }
};
yi0zb3m4

yi0zb3m48#

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

相关问题