Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第8章:类型系统进阶

第8章:类型系统进阶

条件类型(Conditional Types)

1. 基本概念

条件类型(Conditional Types)是 TypeScript 2.8 引入的高级类型特性,它允许基于类型关系进行条件分支判断,语法形式类似于三元表达式:
T extends U ? X : Y
其中:

  • T 是被检查的类型
  • U 是条件类型
  • X 是满足条件时的返回类型
  • Y 是不满足条件时的返回类型

2. 工作原理

type IsString<T> = T extends string ? true : false;

type A = IsString<'hello'>; // true
type B = IsString<number>;  // false

条件类型会触发 分布式条件类型(Distributive Conditional Types) 特性:当传入联合类型时,会按成员逐个判断:

type ToArray<T> = T extends any ? T[] : never;
type StrOrNumArray = ToArray<string | number>; // string[] | number[]

3. 常用内置条件类型

TypeScript 内置了基于条件类型的工具类型:

  • Exclude<T, U>: 从 T 中排除可赋值给 U 的类型
    type T = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
    
  • Extract<T, U>: 从 T 中提取可赋值给 U 的类型
  • NonNullable<T>: 排除 null 和 undefined

4. 类型推断(infer 关键字)

通过 infer 可以在条件类型中声明临时类型变量:

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

function foo() { return 42; }
type FooReturn = ReturnType<typeof foo>; // number

5. 实际应用场景

5.1 API 响应类型处理

type ApiResponse<T> = {
  success: true;
  data: T;
} | {
  success: false;
  error: string;
};

type ExtractData<T> = T extends { success: true; data: infer D } ? D : never;

5.2 递归条件类型(4.1+)

type DeepReadonly<T> = {
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};

type Nested = { a: { b: number } };
type ReadonlyNested = DeepReadonly<Nested>;

6. 注意事项

  1. 避免过度复杂的嵌套条件类型(可能影响编译性能)
  2. 条件类型在未实例化前是惰性求值的
  3. 结合 never 类型可实现更精确的类型过滤

进阶技巧:条件类型常用于类型体操(Type Challenges)中解决复杂类型问题,是构建类型工具库的核心技术。

Last Updated:: 3/27/25, 10:50 AM