异步函数缺少return语句?

时间:2018-04-28 17:37:11

标签: typescript async-await

我刚刚为我正在运行的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);
        }
    }
}

由于

3 个答案:

答案 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,您会看到相同的行为。