正如你在下面的代码中看到的,TS编译器infers类型为:
const message = Math.random() > 0.5 ? "hello, can you here me" : null;
So message变量被推断为"hello, can you here me" | null
,这是有道理的,因为有两个绝对可能值,但是在下面的示例中,返回值仍然是绝对值,但 getName 类型是string
原始类型不是John Gump
const getName = () => "John Gump";
所有与此问题相关的有关文字类型扩展的规则都写在公关/#10676 https://github.com/microsoft/TypeScript/pull/10676.
我们看第一个表达式:
const message = Math.random() > 0.5 ? "hello, can you here me" : null;
适用于本声明的第一条规则如下:
表达式中出现的字符串或数字文字的类型是扩展文字类型。
该表达式本身被推断为“扩大文字类型”这是一个可以被编译器扩展的文字类型作为适当的.
但这在我们的例子中合适吗?公关声明指出
没有类型注释的 const 变量或只读属性推断的类型是初始值设定项的类型。
As message
is a const
变量,类型加宽文字类型的表达式是not加宽并保持"hello, can you here me" | null
.
编译器会发现加宽适合于let
多变的。
let message = Math.random() > 0.5 ? "hello, can you here me" : null;
// ^? message: string | null
当谈到推断函数返回类型时,PR 指出
在没有返回类型注释的函数中,如果推断的返回类型是文字类型(但不是文字联合类型),并且该函数没有返回类型包含文字类型的上下文类型,则返回类型将扩展为其扩展的文字类型
我们再看一下这个函数:
const getName = () => "John Gump";
我们可以看到函数返回类型确实是文字类型"John Gump"
。这不是工会,也没有语境类型结果是返回类型被扩展为其扩展的文字类型string
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)