我刚刚为我正在运行的bug编写了以下方法,并且想知道为什么编译器没有抱怨以下函数有可能不返回?如果我改为编写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);
}
}
}
由于
答案 0 :(得分:3)
Section 6.3 of the TypeScript spec解释了这一点(重点补充):
显式类型函数,其返回类型不是Void类型,Any类型或包含Void或Any类型作为组成的union类型,其主体中必须至少有一个return语句。此规则的一个例外是函数实现是否包含单个'throw'语句。
您的函数有一个可到达的return语句,因此它满足此要求。如果您将return
放在if (false)
内,则不予考虑,因为它无法访问。
如果它在没有显式返回的情况下终止,它将隐式返回undefined
的承诺,当Promise<number>
选项未启用时,这是strictNullChecks
的允许值。< / p>
这与async
无关。以下也编译没有错误:
function getData(): number {
if (1 + 1 === 3) {
return 7;
}
}
就像这样:
function getData(): number {
if (1 + 1 === 3) {
return undefined;
}
}
如果if(data&amp;&amp; data.json()。length)为false,会发生什么?这个函数会返回什么吗?
它返回一个解析为undefined
的承诺,因为它标记为async
,而async
函数始终返回承诺。
请注意(正如Tom Fenech在我之前指出的那样),使用strictNullChecks会导致您的函数和此答案中的函数产生编译器错误,因为undefined
不被视为{number
的可能值1}}启用该选项时。
答案 1 :(得分:1)
async
函数总是返回一个promise。如果if (false)
TypeScript编译器抱怨,因为return
语句无法访问。在这种情况下,该函数返回undefined
的承诺。如果data && data.json().length
为false,也会发生这种情况,但编译器无法检测到此问题。
如果该函数没有要返回的默认值,则该函数在函数末尾不需要显式return
,但应该相应地键入它:
private async getData(items: any[]): Promise<number|void> {
for(const item of items) {
let data = await item.promise;
if (data && data.json().length) {
return data.json().findIndex(d => d.fqdn);
}
}
}
答案 2 :(得分:0)
该函数始终返回Promise。在函数隐式返回的情况下,Promise将解析为undefined。
启用strictNullChecks
时,这会导致编译器错误。
您可以在TypeScript playground中看到这一点(尝试在选项中切换strictNullChecks
):
async function a(i: boolean): Promise<number> {
if (i) return 5;
}
您还可以删除async
关键字并将返回类型更改为number
,您会看到相同的行为。