typescript - 异步函数缺少返回语句?
问题描述
我刚刚为我正在工作的错误编写了以下方法,并且想知道为什么编译器没有抱怨以下函数可能不返回?如果我改为编写if (false)
编译器,则会立即抱怨并非所有路径都返回值。
如果if (data && data.json().length)
是假的会发生什么?这个函数有返回任何东西吗?
private async getData(items: any[]): Promise<number> {
for(const item of items) {
let data = await item.promise;
if (data && data.json().length) {
return data.json().findIndex(d => d.fqdn);
}
}
}
谢谢
解决方案
TypeScript 规范的第 6.3 节解释了这一点(强调添加):
返回类型不是 Void 类型、Any 类型或包含 Void 或 Any 类型作为组成部分的联合类型的显式类型函数必须在其主体中的某处至少有一个 return 语句。此规则的一个例外是函数实现是否包含单个“抛出”语句。
你的函数有一个可达的返回语句,所以它满足这个要求。如果你把它return
放在一个 里面if (false)
,它不会被考虑,因为它是不可访问的。
如果它在没有显式返回的情况下终止,它将隐式返回一个承诺 for ,这是未启用该选项时的undefined
允许值。Promise<number>
strictNullChecks
这与async
. 以下也编译没有错误:
function getData(): number {
if (1 + 1 === 3) {
return 7;
}
}
就像这样:
function getData(): number {
if (1 + 1 === 3) {
return undefined;
}
}
如果 (data && data.json().length) 为假会发生什么?这个函数有返回任何东西吗?
它返回一个解析为 的承诺undefined
,因为它被标记为async
,并且async
函数总是返回承诺。
请注意(正如 Tom Fenech 在我之前指出的那样),使用 strictNullChecks 会导致您的函数和此答案中的函数产生编译器错误,因为undefined
不被认为number
是启用该选项时的可能值。
推荐阅读
- plotly - Plotly.js v2.0.0 默认悬停模式
- typescript - 当使用 WebdriverIO 、 Jasmine 、 TypeScript 的异步模式时, except().toBePresent 不起作用
- pandas - 转义具有双引号的json字符串
- python - 如何在 Pandas 中将 'Month(String) YYYY' 转换为 'YYYY-MM-DD'?
- java - Webview后退按钮问题(堆叠多次点击)
- javascript - 触摸黄色块后如何使用jquery或CSS显示蓝色块?
- hyperledger-fabric - 对于多主机 Hyperledger fabric2.0 对等生命周期链代码approvalformyorg 错误:超时等待所有对等点上的txid
- awk - 通过在 grep 之后组合来替换工作
- highcharts - 使用 highchart minPointLength 在 x-range 图表中显示微小数据,导致不规则的时间间隔
- loops - 输入多个字母作为输入时循环多次打印语句 - GoLang