首页 > 解决方案 > 异步函数缺少返回语句?

问题描述

我刚刚为我正在工作的错误编写了以下方法,并且想知道为什么编译器没有抱怨以下函数可能不返回?如果我改为编写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);
        }
    }
}

谢谢

标签: typescriptasync-await

解决方案


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是启用该选项时的可能值。


推荐阅读