0Pricing
TypeScript Academy · 课时

可分配条件类型

理解条件类型如何分配到联合成员上

可分配条件类型 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

欢迎

可分发条件类型会分别应用于联合类型的每个成员。这种强大的行为支持联合类型的转换和筛选。

什么是分发

当条件类型包含未包装的泛型 T,且 T 是联合类型时,TypeScript 会分别对每个联合成员应用该条件。
type Wrap<T> = T extends any ? { value: T } : never;
type R = Wrap<string | number>;
// = { value: string } | { value: number }

关键条件

只有当 T 是未包装的泛型类型参数时,才会发生分发。将 T 包装在元组中可以阻止分发。
type Bare<T> = T extends string ? 'yes' : 'no';
type Wrapped<T> = [T] extends [string] ? 'yes' : 'no';
type B = Bare<'a' | 'b'>; // 'yes' | 'yes' = 'yes'
type W = Wrapped<'a' | 'b'>; // 'no' — treated as a tuple

使用 never 筛选联合类型

从 false 分支返回 never 可以筛除联合类型成员。
type StringsOnly<T> = T extends string ? T : never;
type S = StringsOnly<string | number | boolean>; // string

内置工具 Extract

Extract 使用可分发条件类型实现,只保留可赋值给 U 的成员。
type Extract<T, U> = T extends U ? T : never;
type E = Extract<string | number | boolean, string | number>; // string | number

内置工具 Exclude

Exclude 会移除可赋值给 U 的联合类型成员。
type Exclude<T, U> = T extends U ? never : T;
type Ex = Exclude<string | number | boolean, boolean>; // string | number

ToArray 的分发

通过分发机制,分别对每个联合类型成员应用 ToArray。
type ToArray<T> = T extends any ? T[] : never;
type R = ToArray<string | number>; // string[] | number[]

阻止分发的使用场景

有时您需要将整个联合类型视为单个类型参数,而不是对其进行分发。
type IsUnion<T> = [T] extends [T] ? [T] extends [Exclude<T, T>] ? false : true : false;

可分发映射类型

结合可分发条件类型和映射类型,可以转换选定的属性。
type PickByValue<T, V> = {
  [K in keyof T as T[K] extends V ? K : never]: T[K]
};

ReturnType 中的可分发条件类型

可分发行为使 ReturnType 在 T 是函数类型联合时仍能正确工作。
type Fn = (() => string) | (() => number);
type R = ReturnType<Fn>; // string | number

即时分发与延迟分发

TypeScript 会推迟对包含自由类型参数的条件类型求值,直到这些参数被解析——这就是延迟求值。

快速检查

当 T 不是未包装的泛型时,`type R = (string | number) extends string ? 'yes' : 'no'` 的结果是什么?

回顾

当 T 是未包装的泛型参数时,可分发条件类型会分别应用于每个联合类型成员。这为 Extract、Exclude 和自定义联合类型筛选提供了基础。将类型包装在元组中可以阻止分发。

常见问题解答

「可分配条件类型」课时是免费的吗?

是的 — 「可分配条件类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「可分配条件类型」这节课中我会学到什么?

理解条件类型如何分配到联合成员上 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「可分配条件类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. keyof 与索引访问类型
  2. 泛型约束:收窄类型参数
  3. 条件类型:T extends U ? X : Y
  4. 可分配条件类型
← 返回 TypeScript Academy