新闻详情

新闻详情

首页 / 资讯中心 / 详情

TypeScript 条件类型中的 `infer` 类型推断:从《The Concise TypeScript Book》掌握类型提取的进阶用法

发布时间:2026/9/25 2:20:34来源:尧图网络
TypeScript 条件类型中的 `infer` 类型推断:从《The Concise TypeScript Book》掌握类型提取的进阶用法
文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载infer是 TypeScript 条件类型中用于从依赖泛型参数的类型中提取推断该泛型参数的核心关键字它让类型定义从显式声明走向自动推导是编写灵活、可复用类型工具如ReturnType、Parameters的底层基石。本文将基于开源仓库 typescript-book 中第 42 节内容展开结合仓库内条件类型、预定义条件类型与类型操纵等章节系统讲解infer的语法、工作方式、约束条件与典型实战模式读完即可在业务代码中熟练编写自己的类型提取工具。从条件类型说起infer的语法基础infer只能出现在条件类型的extends分支中。条件类型Conditional Types允许我们根据条件决定最终类型其语法由extends关键字与三元运算符构成第 40 节type IsArrayT T extends any[] ? true : false; const myArray [1, 2, 3]; const myNumber 42; type IsMyArrayAnArray IsArraytypeof myArray; // Type true type IsMyNumberAnArray IsArraytypeof myNumber; // Type false在这段代码中T extends any[]是条件true与false分别是条件成立与不成立时的结果类型。条件类型解决的是是或否的判定问题而infer解决的则是如果是那它到底是什么的提取问题——它是在条件成立的场景下声明一个可被 TypeScript 编译器自动推断的占位类型变量。infer的核心用法从依赖类型中提取泛型参数关联文档原文infer-type-inference-in-conditional-types.md Le mot-cléinferest utilisé dans les types conditionnels afin dinférer (extraire) le type dun paramètre générique depuis un type qui en dépend. Il permet ainsi décrire des définitions de types plus souples et réutilisables. infer关键字用于条件类型中以便从依赖泛型参数的类型中推断提取该泛型参数的类型从而编写更灵活、可复用的类型定义。下面是文档给出的最典型示例type ElementTypeT T extends (infer U)[] ? U : never; type Numbers ElementTypenumber[]; // number type Strings ElementTypestring[]; // string逐行拆解ElementTypeT是一个泛型条件类型T extends (infer U)[]判断T是否是一个数组类型。若成立U会被自动推断为该数组的元素类型条件成立时返回U即数组元素类型不成立时返回nevernever 类型 表示永不出现的值在此充当提取失败的兜底代入number[]时U被推断为number代入string[]时U被推断为string。注意U不需要在泛型参数列表中显式声明——它完全由编译器从(infer U)[]的结构中自动推导这正是infer名称inference推断的由来。从函数签名提取参数类型infer不仅适用于数组也适用于函数签名。仓库 type-manipulation.md 第 4957 行给出了一个从函数参数中提取类型的示例type ExtractParamT T extends (param: infer P) any ? P : never; type MyFunction (name: string) number; type ParamType ExtractParamMyFunction; // string这里(param: infer P) any匹配任意函数类型并将第一个参数的类型推断为P最终ParamType得到string。这说明infer的位置占位能力可以作用于函数的参数位、返回位等多种结构位。infer的约束条件与注意事项根据官方语义与仓库文档使用infer需遵守以下约束约束说明仅限条件类型infer只能出现在条件类型T extends X ? Y : Z的Xextends 右侧中不能在普通类型别名、接口或类中单独使用位置绑定infer U必须出现在被匹配结构的具体位置上如(infer U)[]的数组内部、(param: infer P)的参数位、() infer R的返回位编译器根据该位置推断U联合类型的分配条件类型在传入裸类型参数裸的联合类型时会逐个成员分配执行见分配条件类型infer也会随之在每个成员上独立推断推断失败返回兜底当T不满足匹配结构时走else分支惯例上返回never表示无法提取一个直接相关的推论infer的位置决定提取结果。例如将infer放在返回位即可提取函数返回值type GetReturnT T extends (...args: any[]) infer R ? R : never; type Add (x: number, y: number) number; type Result GetReturnAdd; // number这与仓库 type-from-func-return.md 讨论的从函数实现自动推断返回类型呼应前者是编译器对函数体的推断后者则是我们用infer从函数类型签名中主动提取。实战infer的进阶模式模式一推断元组Tuple中指定位置的类型结合仓库 fixed-length-tuple.md 对定长元组的介绍infer可与元组结构配合提取特定元素类型type FirstT extends any[] T extends [infer F, ...any[]] ? F : never; type Tuple [string, number, boolean]; type FirstType FirstTuple; // string[infer F, ...any[]]通过 rest 元素匹配元组剩余部分将F绑定到首元素位置。模式二infer与分配条件类型的组合仓库 distributive-conditional-types.md 展示了条件类型对联合类型的分配行为。当infer与联合类型相遇时结果会按成员合并type ElementTypeT T extends (infer U)[] ? U : never; type Union ElementType(string | number)[]; // string | number这里(string | number)[]作为一个整体匹配(infer U)[]U被推断为string | number展示了infer与联合类型的自然协作。模式三逐层递归解包Awaited 的思路infer允许在类型层面做递归解包。仓库 type-manipulation.md 第 8187 行提到的内置工具类型AwaitedT本质上是递归展开 Promise的infer用法我们可以手写一个简化版type UnwrapT T extends Promiseinfer R ? UnwrapR : T; type A UnwrapPromisePromisestring; // string每次匹配Promiseinfer R就把R取出若R仍是 Promise 则继续递归直到遇到非 Promise 类型为止。infer与内置工具类型的血缘关系infer并非冷门技巧——TypeScript 语言内置的多个常用工具类型正是基于它实现的。仓库 predefined-conditional-types.md 列举了这些内置条件类型其中两个最典型的infer应用是ReturnTypeType提取函数类型Type的返回类型ParametersType提取函数类型Type的参数类型结果为元组。它们的实现逻辑与前面手写的GetReturn、ExtractParam完全同源可以理解为官方版的 infer 提取工具type Func (name: string) number; type R ReturnTypeFunc; // number type P ParametersFunc; // [name: string]此外仓库 type-manipulation.md 还列出了更多依赖类似机制的类型工具ConstructorParametersT提取构造函数参数内部通过new (...args: infer P) any匹配构造函数签名、InstanceTypeT、ThisParameterTypeT、OmitThisParameterT等。理解infer就等于掌握了这批内置工具类型的底层实现原理遇到官方工具不满足需求时完全可以照着同样的思路写出自定义的提取类型。小结infer只能用于条件类型的extends分支中作用是从被匹配的结构中自动推断并提取某个位置上的类型经典形态T extends (infer U)[] ? U : never可提取数组元素类型返回位() infer R可提取函数返回类型参数位(param: infer P)可提取参数类型提取失败时惯例返回never作为兜底它是ReturnType、Parameters、Awaited等内置工具类型的实现基石也是编写自定义类型提取工具的通用手法相关延伸阅读条件类型、分配条件类型、预定义条件类型、类型操纵。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐《The Concise TypeScript Book》精读条件类型中的 infer 类型推断《The Concise TypeScript Book》精读条件类型中的 infer 类型推断 在 TypeScript 的类型系统中 infer 是条件文档教程Wekan 自定义主题与 CSS 主题开发完全指南从 Stylish 覆盖到内置主题系统Wekan 自定义主题与 CSS 主题开发完全指南从 Stylish 覆盖到内置主题系统 本文是一份面向 Wekan 开发者与高级用户的主题定制实战指南。文章文档教程The Concise TypeScript BookConditional 类型中的 infer 类型推断实战指南The Concise TypeScript BookConditional 类型中的 infer 类型推断实战指南 本篇指南围绕开源项目 typ/types文档教程上一篇rmlint 开源项目教程下一篇tmux-mem-cpu-load 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

jc 流式解析 iostat 输出:`--iostat-s` 流式解析器原理与实战指南 2026/9/25 2:58:04

jc 流式解析 iostat 输出:`--iostat-s` 流式解析器原理与实战指南

开发工具 【免费下载链接】jc CLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.…

阅读更多 →
treg 数据模型全解析:注册表表结构、异步数据库池与审计写入器 2026/9/25 2:58:04

treg 数据模型全解析:注册表表结构、异步数据库池与审计写入器

后端API网关MCP 服务dsh-plugin 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg 点击查看 免费下载 导读 本文是 treg(OpenRouter …

阅读更多 →
wx_channels_download v260823 版本详解:元宝免配置解析、第三方下载器集成与 MCP 能力扩展 2026/9/25 2:58:04

wx_channels_download v260823 版本详解:元宝免配置解析、第三方下载器集成与 MCP 能力扩展

桌面应用视频网络MCP 服务 【免费下载链接】wx_channels_download 微信视频号下载器 项目地址: https://gitcode.com/gh_mirrors/wx/wx_channels_download 点击查看 免费下载 v260823 是微信视频号下载器 wx_channels_download 的一次重要功能更新,围绕…

阅读更多 →
DeepSeek 多模态 API 接入实测:用 TaoToken 统一 Key 跑通 deepseek-v4-flash-vision-exp 图像理解 2026/9/25 2:58:04

DeepSeek 多模态 API 接入实测:用 TaoToken 统一 Key 跑通 deepseek-v4-flash-vision-exp 图像理解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CodeQL 1.24 JavaScript 分析改进全解析:查询、库与框架支持深度指南 2026/9/25 2:58:04

CodeQL 1.24 JavaScript 分析改进全解析:查询、库与框架支持深度指南

静态分析SAST应用安全漏洞扫描代码质量 【免费下载链接】codeql CodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security 项目地址: https://gitcode.com/gh_mirrors/co/code…

阅读更多 →
i3老机流畅运行Win11 26H2的底层优化实践 2026/9/25 2:57:57

i3老机流畅运行Win11 26H2的底层优化实践

1. 项目概述:为什么“i3老机跑Win11 26H2”成了真实可行的工程问题,而不是一句空话“Win11 26H2让i3老机流畅运行”——这标题乍看像营销话术,但如果你真拆开Windows 11 26H2的系统镜像、翻过微软官方文档、在i3-4170(2013年发布&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉