异步函数缺少返回语句?

Use*_*842 5 async-await 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

JLR*_*she 6

TypeScript 规范的第 6.3 节解释了这一点(强调):

返回类型不是 Void 类型、Any 类型或包含 Void 或 Any 类型作为成分的联合类型的显式类型函数必须在其主体中的某处至少有一个 return 语句。此规则的一个例外是,如果函数实现由单个“throw”语句组成。

你的函数有一个可达的 return 语句,所以它满足这一要求。如果您将其return放在 an 内部if (false),则不会考虑它,因为它无法访问。

如果它在没有显式返回的情况下终止,它将隐式返回一个承诺 for undefined,这是未启用选项Promise<number>时的允许值strictNullChecks

这与 无关async。以下也编译没有错误:

function getData(): number { 
    if (1 + 1 === 3) {
        return 7;
    }
}
Run Code Online (Sandbox Code Playgroud)

就像这样:

function getData(): number { 
    if (1 + 1 === 3) {
        return undefined;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果 (data && data.json().length) 为 false 会发生什么?这个函数有返回任何东西吗?

它返回一个解析为 的承诺undefined,因为它被标记为async,并且async函数总是返回承诺。

请注意(正如 Tom Fenech 在我之前指出的那样),使用 strictNullChecks 会导致您的函数和此答案中的函数产生编译器错误,因为undefined它不被视为number启用该选项时的可能值。


Tom*_*ech 0

该函数始终返回一个 Promise。在函数隐式返回的情况下,Promise 将解析为未定义。

启用后strictNullChecks,这应该会导致编译器错误。

您可以在TypeScript 游乐场中看到这一点(尝试strictNullChecks在选项中切换):

async function a(i: boolean): Promise<number> {
    if (i) return 5;
}
Run Code Online (Sandbox Code Playgroud)

您还可以删除async关键字并将返回类型更改为number,您将看到相同的行为。