0Pricing
React Academy · 课时

React 中的条件类型与映射类型

使用条件类型,根据其他属性值的不同构建形状不同的组件属性类型。

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

条件类型基础

条件类型使用 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
type C = IsString<'hello'>; // true

根据其他属性设置条件属性

使用条件类型,根据另一个属性的值将某个属性设为必填或可选。

type InputProps<T extends 'text' | 'number'> = {
  type: T;
} & (T extends 'number' ? { min?: number; max?: number } : { maxLength?: number });

const numInput: InputProps<'number'> = { type: 'number', min: 0, max: 100 };
const txtInput: InputProps<'text'> = { type: 'text', maxLength: 50 };

映射类型

映射类型通过转换现有类型的每个属性来创建新类型。in keyof 语法会遍历所有键。

type Optional<T> = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };

让更新表单的属性变为可选

对于并非所有字段都必填的更新表单属性,可以使用 Partial<T>(一种内置映射类型)。

interface User { id: string; name: string; email: string; role: string; }

// Update form — all fields optional:
type UserUpdateProps = Partial<Omit<User, 'id'>>;

function UserUpdateForm(props: UserUpdateProps) {
  // name, email, role are all optional
}

使用映射类型的 Record

创建查找类型,使键来自一个联合类型,而值具有一致的结构。

type Status = 'idle' | 'loading' | 'success' | 'error';

type StatusConfig = Record<Status, {
  label: string;
  icon: React.ReactNode;
  color: string;
}>;

const statusConfig: StatusConfig = {
  idle: { label: 'Ready', icon: <ReadyIcon />, color: 'gray' },
  loading: { label: 'Loading...', icon: <Spinner />, color: 'blue' },
  success: { label: 'Done', icon: <CheckIcon />, color: 'green' },
  error: { label: 'Error', icon: <XIcon />, color: 'red' },
};

选取必填键

使用带有 -?(移除可选性)的条件类型,仅提取类型中的必填键。

type RequiredKeys<T> = {
  [K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];

interface FormData { name: string; email: string; phone?: string; }
type Required = RequiredKeys<FormData>; // 'name' | 'email'

模板字面量类型

模板字面量类型可以组合字符串字面量类型,从而支持类型安全的事件名称、CSS 类字符串和 API 路径。

type EventName = 'click' | 'change' | 'focus';
type HandlerName = `on${Capitalize<EventName>}`;
// 'onClick' | 'onChange' | 'onFocus'

type ApiPath<R extends string> = `/api/${R}`;
type UserPath = ApiPath<'users'>; // '/api/users'

有条件地提取属性

使用 Extract 和 Exclude 过滤联合类型。

type AllProps = 'onClick' | 'onHover' | 'onChange' | 'style';
type EventHandlers = Extract<AllProps, `on${string}`>;
// 'onClick' | 'onHover' | 'onChange'

type NonEventProps = Exclude<AllProps, `on${string}`>;
// 'style'

用于表单验证的映射类型

生成与表单数据结构相匹配的验证错误类型——每个字段对应一个错误消息字符串。

interface LoginForm { email: string; password: string; }

type FormErrors<T> = { [K in keyof T]?: string };
type LoginErrors = FormErrors<LoginForm>;
// { email?: string; password?: string }

const errors: LoginErrors = { email: 'Invalid email format' };

判别映射类型

将映射类型与条件类型结合起来,创建会根据判别字段改变结构的类型。

type EventMap = {
  click: { x: number; y: number };
  keydown: { key: string; code: string };
  resize: { width: number; height: number };
};

type Handler<E extends keyof EventMap> = (event: EventMap[E]) => void;

function on<E extends keyof EventMap>(event: E, handler: Handler<E>) {
  window.addEventListener(event, handler as EventListener);
}

何时不要过度设计类型

条件类型和映射类型功能强大,但也会增加复杂性。只有在它们能够消除实际重复或防止实际错误时才使用,而不要只是为了展示 TypeScript 知识。

快速检查

映射类型 { [K in keyof T]?: T[K] } 的作用是什么?

回顾

条件类型(T extends U ? X : Y)会根据可赋值性创建分支类型。映射类型([K in keyof T])会转换类型的每个属性。您可以使用它们创建更新表单的部分类型、类型安全的事件映射、表单错误结构和模板字面量 API 路径。

常见问题解答

「React 中的条件类型与映射类型」课时是免费的吗?

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

「React 中的条件类型与映射类型」这节课中我会学到什么?

使用条件类型,根据其他属性值的不同构建形状不同的组件属性类型。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

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

「React 中的条件类型与映射类型」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. 组件变体的可辨识联合类型
  2. React 中的条件类型与映射类型
  3. 带有 'as' 属性的多态组件
  4. 类型安全的表单与 API 响应契约
← 返回 React Academy