理解条件类型中的 infer
在 extends 子句中使用 infer 提取内部类型
理解条件类型中的 infer 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
什么是类型推断?
infer 关键字出现在条件类型中,可以让 TypeScript 从匹配的位置捕获一个类型变量,以便您在真分支中使用它。
type GetReturn<T> = T extends (...args: any[]) => infer R ? R : never;基础类型推断示例
这里使用 infer R 提取任意函数的返回类型。
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type A = ReturnType<() => string>; // string
type B = ReturnType<() => number[]>; // number[]类型推断如何工作
TypeScript 会将 T 的结构与模式进行匹配。如果匹配成功,推断出的变量就会保存匹配到的部分;如果匹配失败,则执行假分支。
type First<T> = T extends [infer F, ...any[]] ? F : never;
type X = First<[string, number, boolean]>; // string从泛型参数进行推断
您可以推断泛型类型的类型参数,例如从 Promise 中提取 T。
type Unwrap<T> = T extends Promise<infer U> ? U : T;
type A = Unwrap<Promise<string>>; // string
type B = Unwrap<number>; // number多个推断变量
您可以在单个条件类型中使用多个 infer 子句,同时捕获多个位置的类型。
type Head<T> = T extends [infer H, ...infer Tail] ? H : never;
type Tail<T> = T extends [infer H, ...infer Tail] ? Tail : never;从函数参数进行推断
类型推断同样可以捕获函数参数类型,而不仅仅是返回类型。
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;
type A = FirstParam<(x: string, y: number) => void>; // string类型推断的分布式行为
当 T 是联合类型时,条件类型(包括包含 infer 的条件类型)会分布到联合类型的每个成员上。
type UnwrapAll<T> = T extends Promise<infer U> ? U : T;
type X = UnwrapAll<Promise<string> | Promise<number>>;
// string | number嵌套类型推断
您可以嵌套使用 infer,深入类型结构的内部,例如提取 Promise 中数组的元素类型。
type UnwrapPromiseArray<T> =
T extends Promise<infer U>
? U extends (infer V)[]
? V
: U
: T;使用字符串模式进行类型推断
将模板字面量类型与 infer 结合,可以从字符串字面量类型中提取子字符串。
type GetDomain<T extends string> =
T extends `https://${infer Domain}` ? Domain : never;
type D = GetDomain<"https://example.com">; // "example.com"常见陷阱
类型推断只能在条件类型的 extends 子句中使用。在其他位置使用会导致编译错误。此外,假分支中无法使用 infer。
// Error: infer can only appear in extends clauses
type Bad<T> = infer R; // SyntaxError回顾:类型推断
infer 关键字可以让 TypeScript 在条件类型的结构匹配中捕获一个类型片段。它为 ReturnType、Parameters 和 Awaited 等工具类型提供了基础。
快速检查
infer 关键字可以在哪里使用?
您学到的内容
infer 关键字通过从结构模式中提取类型片段,实现了类型级别的模式匹配。它是 TypeScript 中强大工具类型和类型安全元编程的基础。
常见问题解答
「理解条件类型中的 infer」课时是免费的吗?
是的 — 「理解条件类型中的 infer」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「理解条件类型中的 infer」这节课中我会学到什么?
在 extends 子句中使用 infer 提取内部类型 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「理解条件类型中的 infer」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。