为什么 Typescript 编译器将函数的返回类型推断为“原始类型”,而返回值是已知值?

2024-01-25

正如你在下面的代码中看到的,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(使用前将#替换为@)

为什么 Typescript 编译器将函数的返回类型推断为“原始类型”,而返回值是已知值? 的相关文章

随机推荐

  • Phonegap 2.6 与 KeyboardShrinksView 和 HideKeyboardFormAccessoryBar

    我对 2 6 ios 中的新 PhoneGap 功能之一有疑问 最后他们包含了一个缩小 WebView 以处理固定元素的选项 不幸的是 结合HideKeyboardFormAccessoryBar选项设置为 true 会出现一个奇怪的白色条
  • IValueConverter 并绑定 DependencyObject

    我有一个ComboBox我需要做一个转换器SelectedItem 问题是IValueConverter需要绑定值 但也需要一个集合 配置了一个DependencyObject但它给了我一个错误消息 类型 System Windows Da
  • 当电影绘制到画布中时 Android 错误信号 11

    我正在开发一个 Android 应用程序 我试图在其中显示 GIF 图像 为此 我使用 Movie 类并创建了一个扩展 View 的类 GIFView 我从 Movie decodeFile 方法获取 Movie 实例 调用 Movie d
  • WiX 主要升级 Windows 服务,保留 .config,并避免重新启动

    我正在努力让 MajorUpgrade ServiceControl config 文件能够很好地协同工作 在我提出其他问题之后 https stackoverflow com questions 22770414 wix majorupg
  • git-shell - 新存储库

    我有一台专门的服务器git用户和存储库我正在尝试使用git shell method http git scm com book en Git on the Server Setting Up the Server让我的开发人员能够从事多个
  • 使用反向引用作为重复计数的正则表达式

    有什么方法可以构造一个按如下方式工作的正则表达式 将整数匹配为组1 然后匹配 1整数 This d s d 1 不幸的是 这是不允许的 但我发现它很好地描述了我想要实现的目标 你可以做这样的事情 var numbers 3 7 6 5 4
  • cakephp 从另一个助手中访问助手

    如何使用我构建的新帮助程序方法访问另一个帮助程序 例如 FormHelper class AppHelper extends Helper public function generateSpecialInput return this g
  • 通过shiny + rgl捕获坐标

    是否可以使用 recognize3d 或类似的方法来捕获通过渲染 Rglwidget 渲染的 rgl 场景中的地标坐标 我在闪亮中使用以下代码进行渲染 server observeEvent input mspec3D tt1 lt out
  • 在页面之间导航时闪烁

    当我在页面之间导航时 我的phonegap jquery 移动应用程序大部分时间都会闪烁 这是正常现象还是有解决办法 ui page webkit backface visibility hidden 这对我在phonegap jquery
  • 使用 openCv c++ 复制图像的一部分

    我正在使用 opencv 我想从另一个图像的一部分创建一个图像 我没有找到这样做的函数 所以我尝试实现我的想法 其中包括逐像素复制图像 但徒劳地我没有得到我正在等待的结果 任何人都有另一种想法 Code include cv h inclu
  • fullcalendar 无法读取未定义的属性“fn”

    我嵌入了fullcalendar min js到我的项目 但我收到此错误 错误日志显示 无法读取未定义的属性 fn 见下图 我检查了这个问题 建议使用jQuery 2 0 0 并且我肯定会使用jQuery v3 3 1 但无助于问题的解决
  • React Native RNFetchBlob 下载后获取文件的 URI

    我正在开发一个 React Native 项目 我现在想做的是下载并将下载的文件保存到设备上 我正在使用这个包 https www npmjs com package rn fetch blob https www npmjs com pa
  • Eclipse:将编辑器与内容类型相关联

    我可以根据内容类型而不是单个文件类型更改编辑器关联吗 如果我去Window gt Preferences gt General gt Editors gt File Associations 我看到基于文件扩展名的文件类型列表 例如 单击
  • 原型编程中对象和原型有什么区别?

    我试图理解创建和使用对象的 JavaScript 方式 但我认为我对对象和原型产生了误解 在我开始的一个新项目中 我决定尝试原型继承 我很困惑 这是否意味着我应该创建一个我打算使用的对象 然后基于该对象创建其他对象Object create
  • 使用 $inc 通过 Mongoose 增加文档属性

    我想增加views每次访问我的文档时都会加 1 到目前为止 我的代码是 Document find sort date 1 limit limit exec 哪里有 inc适合这里吗 从未使用过猫鼬 但快速查看文档here http mon
  • R bquote 的反向行为

    bquote函数允许计算表达式中包含的部分 称呼 例如 a lt 2 b lt 100 bquote 2 a x log10 b 会回来 4 x 2 我想重写这个函数来评估除了里面的东西之外的所有东西 称呼 这是期望的行为 a lt 2 b
  • htaccess 将域名重定向到 https,子域重定向到 https,非 www 重定向到 www

    我想这样做 强制我的主域使用 https http to https www https www http www http www to https www https www 但不适用于子域 http subdomain domain
  • 鼠标悬停时突出显示文本行[重复]

    这个问题在这里已经有答案了 我目前正在开发一个网站 该网站将提供大量故事供人们阅读 基本上是一个博客 我想让它们尽可能容易阅读 并且我认为用光标 突出显示 文本行会很有用 有点像读书时用手指跟随文本行 我偶然发现这个答案 https sta
  • 解释 jstat 结果

    我是 jstat 工具的新手 因此我做了如下示例 jstat gcutil t 4001 5000 Timestamp S0 S1 E O P YGC YGCT FGC FGCT GCT 565088 4 0 00 0 89 75 86 4
  • 为什么 Typescript 编译器将函数的返回类型推断为“原始类型”,而返回值是已知值?

    正如你在下面的代码中看到的 TS编译器infers类型为 const message Math random gt 0 5 hello can you here me null So message变量被推断为 hello can you