ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

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),仅供参考
返回列表