0Pricing
TypeScript Academy · 课时

条件类型:T extends U ? X : Y

使用条件类型编写类型层面的 if 语句

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

欢迎

条件类型可以表达类型层面的 if 语句。它们是 TypeScript 高级类型系统的核心组成部分,用于构建工具类型。

基本语法

写作 T extends U ? X : Y。如果 T 可赋值给 U,结果就是 X;否则就是 Y。
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false

内置类型 NonNullable

NonNullable 通过条件类型实现,用于从 T 中移除 null 和 undefined。
type NonNullable<T> = T extends null | undefined ? never : T;
type C = NonNullable<string | null>; // string

泛型中的条件类型

条件类型在泛型函数和类型别名中最有用。
type Flatten<T> = T extends Array<infer I> ? I : T;
type Str = Flatten<string[]>; // string
type Num = Flatten<number>;   // number

嵌套条件类型

条件类型可以嵌套,以实现更复杂的逻辑。
type TypeName<T> =
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  'object';

对联合类型进行分发

当 T 是未包装的类型参数时,条件类型会在联合类型成员之间进行分发。
type ToArray<T> = T extends any ? T[] : never;
type R = ToArray<string | number>; // string[] | number[]

阻止分发

将 T 包装在元组中可以阻止分发。
type NoDistribute<T> = [T] extends [any] ? T[] : never;
type R2 = NoDistribute<string | number>; // (string | number)[]

使用 never 进行筛选

从条件类型返回 never 可以移除联合类型成员。
type OnlyStrings<T> = T extends string ? T : never;
type S = OnlyStrings<'a' | 'b' | 1 | 2>; // 'a' | 'b'

映射类型中的条件类型

结合映射类型和条件类型,可以有选择地转换对象属性。
type NullableValues<T> = { [K in keyof T]: T[K] extends string ? null : T[K] };

从函数参数中推断

在条件类型中使用 infer,可以提取复杂类型的组成部分。
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;
type FP = FirstParam<(a: string, b: number) => void>; // string

内置条件工具

许多内置工具(ReturnType、Parameters、InstanceType)都使用条件类型和 infer 构建。
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

快速检查

`type R = string extends object ? 'yes' : 'no'` 的结果是什么?

回顾

条件类型(T extends U ? X : Y)支持类型层面的逻辑。它们可以对联合类型进行分发,与 infer 结合进行提取,并为 TypeScript 的许多内置工具类型提供基础。

常见问题解答

「条件类型:T extends U ? X : Y」课时是免费的吗?

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

「条件类型:T extends U ? X : Y」这节课中我会学到什么?

使用条件类型编写类型层面的 if 语句 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

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

「条件类型:T extends U ? X : Y」课时需要多长时间?

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

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

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

此课程中的所有课时

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