为什么 Typescript 中需要 infer 关键字?

2024-03-26

为什么 Typescript 开发人员创建了infer关键词? 根据文件 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html,这是如何使用它的示例:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

我不明白为什么需要这个。为什么不能只是:

type ReturnType<T> = T extends (...args: any[]) => R ? R : any;

为什么这不起作用?为什么是infer需要关键字吗?


With infer,编译器确保您已声明所有类型变量明确地:

type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // T1 is { b: string; }

这里我们声明一个new类型变量R in MyType, which 被推断 https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#inferring-within-conditional-types from T.
(注意infer仅在以下范围内使用extends的条款条件类型 https://www.typescriptlang.org/docs/handbook/2/conditional-types.html.)

现在使用未声明的类型参数可能会导致编译错误:

type MyType2<T> = T extends R2 ? R2 : never; // error, R2 undeclared

Without infer,编译器不会知道,如果你想引入一个额外的类型变量R2这是要推断的(参见第一种情况),或者如果R2只是一个意外的打字错误/拼写错误。infer存在就是为了消除这种歧义。

更准确地说,编译器检查,如果T 是可分配的 https://www.typescriptlang.org/docs/handbook/type-compatibility.html to R , when infer被省略:

type R = { a: number }
type MyType3<T> = T extends R ? R : never; // compare T with type R
type T3 = MyType3<{b: string}> // T3 is never

注意infer R同名类型声明的影子类型引用R:

type R = { a: number }
type MyType4<T> = T extends infer R ? R : never;
type T4 = MyType4<{b: string}> // { b: string; }

操场 https://www.typescriptlang.org/play?#code/C4TwDgpgBASlC8UDeUCGAuKA7ArgWwCMIAnKAXwCgLRIoBZEAFXAgEYAeRgPgSkaggAPYBCwATAM5QAllgBmJWFAD8SzFggA3EgG4oAen0z5iuHOIB7PH2ot6TFgCZOPRPyEjxUmI5Wxf6lq6BkYAxlZg0gA2iiSWpAAUAOYWFmIAlLa0DMyQAMwuvO7CopJKqnCB2sR6hlDheGCoxND8AO7SwAAWsFQ0ray8OSwcSASYEsDEsklkPHWMg9JSKONQk9NYSXqU-Xx5Qw757GMTUzNzIfsyUhrVfXbDkAAshW4CJV7GCqRwFVBVXRZVrPQ65CCvU7rc5bS51VZnTbbcgUIA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Typescript 中需要 infer 关键字? 的相关文章

随机推荐

  • 与多个属性共享枚举声明值

    我想要一个具有多个属性的类 可以用数值保存工作日 summary weekday integer collection weekday integer 我想我可以将整数映射到值使用枚举 http edgeapi rubyonrails or
  • ActiveModel 序列化器:运行时有条件吗?

    我使用rails 5 0 1 和active model serializers 0 10 2 我想以某种方式有条件地序列化has many协会 class Question lt ApplicationRecord has many re
  • 如何创建或生成 .mlpd 文件以在 xamarin profiler 中检查应用程序性能

    你好 Xamarin 团队 我正在 Visual Studio 2017 社区中处理 Xamarin 表单 我想检查 Xamarin Profiler 中的应用程序性能 为此 我需要创建一个 mlpd 来检查 Xamarin Profile
  • 单击链接时使用 jQuery/Javascript 更改下拉选项

    假设我有以下链接和下拉菜单 a href contact Send a mail to mother a a href contact Send a mail to father a a href contact Send a mail t
  • 在 Windows 上非侵入式解锁文件

    有没有办法使用 Python 脚本在 Windows 上解锁文件 该文件被另一个进程独占锁定 我需要一个不终止或中断锁定过程的解决方案 我已经看过了门户锁 http code activestate com recipes 65203 一种
  • 在 Eclipse 中重新启动应用程序

    我正在使用 Eclipse Juno 开发一个独立服务器 不是战争 我将它作为 Java 应用程序从 Eclipse 运行 在进行一些代码更改后 我想停止当前正在运行的服务器并再次启动它 我每天这样做几十次 我目前的做法如下 转到 调试 选
  • 如何创建具有自定义外设和内存映射的 QEMU ARM 机器?

    我正在为 Cortex M3 cpu 编写代码 并且正在使用以下命令执行单元测试qemu arm二进制 现在一切都很好 但我想知道我是否能够使用测试整个系统qemu system arm 我的意思是 我想为 qemu 编写自定义 机器 我将
  • 使用RTL布局时如何通过命中测试获取树视图项?

    描述 在从右到左阅读模式 RTL 下有树视图 如何在仅知道单击坐标的情况下获取被单击的节点 这是一个插入类 它使树视图使用 RTL 显示 并包含一个单击处理程序 您可以在其中看到问题 unit Unit1 interface uses Wi
  • 连接充电器时 Android 上的自动开机

    我正在开发一个 Android 应用程序 需要不断地保持该应用程序始终运行 在手机始终连接到电源插座的情况下 如果手机电池耗尽 是否有可能在无需用户干预的情况下自动启动应用程序 即自动打开手机电源 无需按任何电源按钮 并在连接充电器后启动
  • ValidateRequest 错误还是 SQL Server Bug?

    我正在读这个article http software security sans org blog 2011 07 22 bypassing validaterequest in asp net 它说 该字符用值 uff1c 表示 如果将
  • MSGBOX 在 WSH/VBS 中的位置

    这是我的下一个问题 我希望有人可以帮助我 是否可以在 wsh vbs 中放置 msgbox 替代文本 http www 4freeimagehost com uploads a9b04cde0527 jpg http www 4freeim
  • VBA 使用架构文件提取数据

    我下面有这个代码 Option Explicit Sub MadMule2 Dim IE As InternetExplorer Dim el Dim els Dim colDocLinks As New Collection Dim Ti
  • FastAPI 中的单元测试

    我有一个使用 FastAPI 开发的后端应用程序 使用 SQLModel SQLAlchemy 和 Pydantic 并连接到 Postgres 数据库 我有集成测试来测试我的端点是否可以与暂存 PG DB 正常工作 但现在我必须编写单元测
  • 使用波形符 ~ 扩展对 HOME 目录进行测试时得到负面结果

    我收到一个奇怪的错误 似乎无法弄清楚为什么 特别是因为它在一个地方有效 但在另一种情况下无效 我有他的代码来检查这些目录是否存在 并且带有 的 HOME 目录在此代码片段中失败 if d valueToTest then echo Fail
  • 运行自动发现的 python 单元测试的子集

    简短的问题在 Python 的单元测试模块中使用自动发现方法时 是否可以在运行时选择要运行的单元测试 背景我正在使用 unittest 模块在外部系统上运行系统测试 请参阅下面的示例 sudo testcase unittest 模块允许我
  • 使用 500GB 内存时,Pandas pd.melt 在取消旋转 3.5 GB csv 时抛出内存错误

    使用 500GB 内存时 Pandas pd melt 在取消旋转 3 5 GB csv 时抛出内存错误 是否有任何解决方案 功能可用于 unpivot 巨大的 CSV 文件 当前的 csv 有超过 5000 列 我在同样的问题上苦苦挣扎
  • 错误的 UDP 校验和没有效果:为什么?

    我正在尝试测试 UDP 程序 如果它接收到 UDP 校验和错误的数据 会发生什么情况 奇怪的是 它似乎没有任何效果 并且有效负载被成功接收 至少在 OS X 上是通过环回接口成功接收的 下面是一个示例 其中使用以下方式发送数据SOCK RA
  • Elasticsearch 中的 _search 查询如何工作?

    问题更在于 Elasticsearch 节点如何交互以给出特定的搜索结果以及搜索请求的流程是什么 我参考了以下链接来理解 但它们对于我想要理解的内容不是很清楚 https www elastic co guide en elasticsea
  • 使用指针的数组长度[重复]

    这个问题在这里已经有答案了 数组长度可以使用以下方式计算 arr 1 arr然后简化为 arr 1 arr这进一步简化为1 arr arr 但是 当在与完成内存分配的函数不同的函数中计算长度时 会计算出错误的结果 例如 include
  • 为什么 Typescript 中需要 infer 关键字?

    为什么 Typescript 开发人员创建了infer关键词 根据文件 https www typescriptlang org docs handbook release notes typescript 2 8 html 这是如何使用它