使用联合类型进行类型推断 - 不存在最佳通用类型
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 语句中返回一个公共类型......如果你不是,那么代码可能会变得混乱。以上是关于使用联合类型进行类型推断 - 不存在最佳通用类型的主要内容,如果未能解决你的问题,请参考以下文章