使用联合类型进行类型推断 - 不存在最佳通用类型

Posted

技术标签:

【中文标题】使用联合类型进行类型推断 - 不存在最佳通用类型【英文标题】:Type inference with union types - No best common type exists 【发布时间】:2016-07-28 13:05:12 【问题描述】:

所以,我正在玩 TypeScript 中的类型推断。我将提供两个示例,它们在调用时会产生相同的结果,但是其中一个示例由于“没有最佳通用类型”,TypeScript 无法推断类型。

三元运算符示例

function foo(a: boolean) 
    return a ? 4 : true;

编译器推断 foo 是 (a: boolean) => number | boolean,这太棒了。

if 语句示例

function foo(a: boolean) 
    if (a) 
        return 4;
     else 
        return true;
    

编译器在尝试推断返回类型时抱怨“没有最佳通用类型”。 if 语句应该与类型推断混淆,这让我感到困惑。怎么会?

【问题讨论】:

【参考方案1】:

当函数中的返回语句没有通用类型时,将引发该错误。只有存在多个 return 语句时才会发生这种情况。

第一个示例 - 一个返回语句

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

return (a ? 4 : true); // return number | boolean

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

第二个示例 - 多个返回语句

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

if (a) 
    return 4; // return number
 else 
    return true; // return boolean

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

具有多个返回语句的解决方案

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

function foo(a: boolean): number | boolean 
    if (a) 
        return 4;
     else 
        return true;
    

相关:见"Best Common Type"

【讨论】:

是的,我知道类型注释在这里有帮助。那么,从编译器的角度来看,背后的基本原理是什么? @Peter 我找不到任何来源,但我很确定它这样做是为了帮助防止错误。通常你想从所有的 return 语句中返回一个公共类型......如果你不是,那么代码可能会变得混乱。

以上是关于使用联合类型进行类型推断 - 不存在最佳通用类型的主要内容,如果未能解决你的问题,请参考以下文章

LayaBox---TypeScript---类型推论

TypeScript:推断嵌套联合类型的类型

如何使通用可变参数函数中先前声明的函数的返回类型成功进行上下文推断?

如何推断通用属性类型?

使用通用矢量大小类型的最佳方法是啥?

TS-- 类型推论类型兼容性高级类型