使用联合类型键入推断 - 不存在最佳常见类型

Pet*_*ter 6 typescript

所以,我正在使用TypeScript中的类型推断.我将提供两个在调用时产生相同结果的示例,但是在其中一个示例中,由于"没有最佳常见类型",TypeScript无法推断出类型.

三元运算符的示例

function foo(a: boolean) {
    return a ? 4 : true;
}
Run Code Online (Sandbox Code Playgroud)

编译器推断出foo (a: boolean) => number | boolean非常棒.

if语句的示例

function foo(a: boolean) {
    if (a) {
        return 4;
    } else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在尝试推断返回类型时,编译器会抱怨"没有最佳常见类型".令我困惑的是,如果陈述应该混淆类型推断.怎么会?

Dav*_*ret 1

当函数中的 return 语句不具有公共类型时,将会抛出该错误。仅当存在多个 return 语句时才会发生这种情况。

第一个示例 - 一个 return 语句

在第一个示例中,只有一个 return 语句返回键入的值number | boolean(添加括号以强调这是一个表达式):

return (a ? 4 : true); // return number | boolean
Run Code Online (Sandbox Code Playgroud)

没关系。该类型不需要与其他返回语句相同。

第二个示例 - 多个 return 语句

第二个示例有多个 return 语句...

if (a) {
    return 4; // return number
} else {
    return true; // return boolean
}
Run Code Online (Sandbox Code Playgroud)

...并且多个语句之间不存在公共类型。所以会出错。

具有多个 return 语句的解决方案

当 return 语句之间不存在公共类型时,您需要显式地让编译器知道您的意思是这样做:

function foo(a: boolean): number | boolean {
    if (a) {
        return 4;
    } else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

相关:参见“最佳常见类型”