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 反馈 — 无需本地设置。
此课程中的所有课时
- 组件变体的可辨识联合类型
- React 中的条件类型与映射类型
- 带有 'as' 属性的多态组件
- 类型安全的表单与 API 响应契约