ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

The Concise TypeScript Book 精讲:预定义条件类型(Predefined Conditional Types)实用指南

The Concise TypeScript Book 精讲:预定义条件类型(Predefined Conditional Types)实用指南 文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载预定义条件类型是 TypeScript 内置的、基于条件类型机制封装而成的一组合用工具类型用于根据给定类型的特征自动完成常见类型转换。本文以 The Concise TypeScript Book目录总览中Predefined Conditional Types章节为核心骨架逐一拆解Exclude、Extract、NonNullable、ReturnType、Parameters、Required、Partial、Readonly的语义、使用边界与源码级原理并结合仓库中 conditional-types.md、infer-type-inference-in-conditional-types.md、mapped-type-modifiers.md 等相关章节与 type-manipulation.md 的 Utility Types 清单做纵深扩展。读完本文你将能够熟练在业务代码与类型库中正确选用这 8 个内置条件类型并理解其底层实现方式。从条件类型到预定义条件类型预定义条件类型Predefined Conditional Types在 TypeScript 官方术语体系中属于内置条件类型——即语言自带、由编译器实现的一组类型转换工具。它们并非独立的语法特性而是建立在条件类型基础之上的预制件。条件类型Conditional Types用extends关键字加三元表达式根据条件在两个类型之间二选一见 conditional-types.mdtype IsArrayT T extends any[] ? true : false; const myArray [1, 2, 3]; const myNumber 42; type IsMyArrayAnArray IsArraytypeof myArray; // Type true type IsMyNumberAnArray IsArraytypeof myNumber; // Type false其中能赋值给谁的判断T extends U本质上是在问T的所有取值是否都能赋给U所描述的集合。这一集合论视角在本书 exploring-the-type-system.md 的 Types as Sets 一节有系统阐述。在此基础上TypeScript 用infer关键字在条件类型中反向提取泛型参数的真实类型见 infer-type-inference-in-conditional-types.mdtype ElementTypeT T extends (infer U)[] ? U : never; type Numbers ElementTypenumber[]; // number type Strings ElementTypestring[]; // string预定义条件类型正是条件类型 infer 分配律distributive conditional types的工程化组合。本书 distributive-conditional-types.md 章节详细讨论了分配条件类型的行为理解它能帮你判断Exclude/Extract等工具在联合类型上逐成员展开时为何会产生精确结果。联合类型筛选Exclude 与 ExtractExcludeUnionType, ExcludedType从Type中移除所有可赋值给ExcludedType的类型删除联合类型中的指定成员。type Union a | b | c; type MyType ExcludeUnion, a | c; // b官方签名是ExcludeT, U T extends U ? never : T。由于条件类型在裸类型参数naked type parameter上具有分配性T中的每个联合成员都会被单独代入判断能赋给U的成员被替换为never参与联合时自动消融其余成员保留最终得到差集。这在 type-manipulation.md 的 Utility Types 一节中有同款示例ExcludeUnion, a | c结果为b。ExtractType, Union从Union中提取出所有可赋值给Type的类型筛选出联合类型中的指定成员。type Union a | b | c; type MyType ExtractUnion, a | c; // a | c官方签名是ExtractT, U T extends U ? T : never。它与Exclude是互补关系Extract保留交集成员Exclude删除交集成员两者常配合使用例如从全部事件名中剔除已处理事件名得到待处理事件名。可空性清理NonNullableType从Type中移除null和undefined。type Union a | null | undefined | b; type MyType NonNullableUnion; // a | b官方签名是NonNullableT T {}现代版本或NonNullableT T extends null | undefined ? never : T早期版本。无论采用哪种实现其效果都是把null/undefined从联合中剔除。它与编译器选项strictNullChecks直接相关当开启该选项后本书 strictnullchecks.md 有专门章节变量只能显式声明为null | undefined联合时才允许接收空值而NonNullable正是处理这类可能为空类型的最常用工具。例如从 DOM 查询或配置读取得到string | null时用NonNullableT即可得到纯string。函数类型解剖ReturnType 与 ParametersReturnTypeType提取函数Type的返回类型。type Func (name: string) number; type MyType ReturnTypeFunc; // number官方签名为ReturnTypeT T extends (...args: any[]) infer R ? R : any。它利用infer R从函数类型中提取返回值。该能力的背景是 TypeScript 的返回类型推断见 type-from-func-return.md编译器能根据函数实现自动推断返回类型而ReturnType则把这个已经推断出的返回类型从函数类型中显式取出常用于让一个函数的结果类型与另一个函数保持同步避免重复声明。ParametersType提取函数Type的参数类型以元组形式返回。type Func (a: string, b: number) void; type MyType ParametersFunc; // [a: string, b: number]官方签名为ParametersT T extends (...args: infer P) any ? P : never。返回结果是带标签的元组类型[a: string, b: number]标签即原参数的名称关于具名元组可参考 named-tuple-type-labeled.md。典型用途包括用Parameterstypeof fn直接得到某函数的参数列表配合Omit、Partial生成改造版参数类型或在事件系统里把回调参数分发给其他函数。属性形态变换Required、Partial 与 Readonly这三者均属于映射类型Mapped Types家族见 mapped-types.md通过[P in keyof T]遍历已有类型的每个属性并施加变换。本书 mapped-type-modifiers.md 一节明确列出了三种修饰符readonly/readonly使属性只读、-readonly使属性可变、?使属性可选。RequiredType将Type的所有属性变为必需移除可选的?。type Person { name?: string; age?: number; }; type A RequiredPerson; // { name: string; age: number; }官方签名为RequiredT { [P in keyof T]-?: T[P] }其中的-?修饰符把可选标记?显式移除从而保证所有属性非可选。常用于把部分更新请求体强转为完整实体或在表单校验完成后把可能缺失的字段收紧为必定存在。PartialType将Type的所有属性变为可选。type Person { name: string; age: number; }; type A PartialPerson; // { name?: string | undefined; age?: number | undefined; }官方签名为PartialT { [P in keyof T]?: T[P] }使用?修饰符标记每个属性为可选。注意结果类型中每个可选属性被推断为string | undefined/number | undefined这正是 strictnullchecks.md 所描述的行为。它最经典的实战场景是更新接口接受PartialEntity让调用方只传需要修改的字段。ReadonlyType将Type的所有属性变为只读。type Person { name: string; age: number; }; type A ReadonlyPerson; const a: A { name: Simon, age: 17 }; a.name John; // Invalid官方签名为ReadonlyT { readonly [P in keyof T]: T[P] }用readonly修饰符标记每个属性。只读是编译期约束对a.name的赋值会直接产生编译错误但编译后的 JavaScript 中属性仍然可变因此它适合表达领域对象创建后不应被修改的不变量而非运行时安全手段。若要逆向解除只读可结合-readonly自定义MutableT见 mapped-type-modifiers.md 示例。组合实战用预定义条件类型解决真实问题以下三个模式展示了将上述工具组合使用的典型场景可对照 type-manipulation.md 中 Utility Types 清单继续扩展// 1. 回调参数直接复用无需手写参数类型 type MyHandler (id: number, message: string) void; type MyHandlerParams ParametersMyHandler; // [id: number, message: string] // 2. 把外部可能为空的结果收窄为安全类型 type ApiResponse string | null | undefined; type SafeResponse NonNullableApiResponse; // string // 3. 从事件联合中精确筛选需要处理的事件 type AllEvents click | input | scroll | focus; type HandledEvents ExtractAllEvents, click | input; // click | input type RemainingEvents ExcludeAllEvents, HandledEvents; // scroll | focus再结合ReturnType实现类型跟随函数const fetchUser async (): Promise{ id: number; name: string } { // 实现省略返回类型由实现自动推断 return { id: 1, name: Simon }; }; type User ReturnTypetypeof fetchUser; // Promise{ id: number; name: string } type UserData AwaitedUser; // { id: number; name: string }递归解开 Promise这里AwaitedT见 type-manipulation.md 的AwaitedT小节负责递归解开 Promise 嵌套与ReturnType配合即可从任意异步函数无痛导出其返回的数据类型。原理与验证在编译器中印证你的理解如果想亲手验证上述类型结果可以使用本仓库 tools/tsconfig.json 中启用的严格编译环境strict: true、target: es2022、lib: [es2022, ...]cd tools npx tsc --noEmit your-check.ts # 借助 strict 模式验证类型推断通过故意制造错误赋值例如给Exclude得到的b类型赋a或对Readonly类型属性赋值tsc会给出与上文注释一致的类型错误信息从而反向验证每个内置条件类型的精确输出。这是把类型即文档落到实操的推荐路径类型系统本身会替你把使用边界检查清楚。小结预定义条件类型一句话语义底层实现要点ExcludeT, U从T中删除可赋给U的成员T extends U ? never : T依赖分配条件类型ExtractT, U从T中提取可赋给U的成员T extends U ? T : never依赖分配条件类型NonNullableT移除null与undefinedT {}或T extends null \| undefined ? never : TReturnTypeT提取函数返回类型T extends (...args: any[]) infer R ? R : anyParametersT提取函数参数元组T extends (...args: infer P) any ? P : neverRequiredT全部属性变为必需{ [P in keyof T]-?: T[P] }映射类型PartialT全部属性变为可选{ [P in keyof T]?: T[P] }映射类型ReadonlyT全部属性变为只读{ readonly [P in keyof T]: T[P] }映射类型这 8 个预定义条件类型覆盖了联合类型筛选、可空性清理、函数类型解剖与对象属性形态变换四大类日常需求是 TypeScript 类型编程的标准库。深入掌握它们再结合本书 conditional-types.md、infer-type-inference-in-conditional-types.md、mapped-types.md 与 type-manipulation.md 等章节你就能在此基础上自行封装自定义条件类型写出更精确、更可复用的类型体系。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐The Concise TypeScript Book 精讲TypeScript 预定义条件类型Predefined Conditional Types全解析The Concise TypeScript Book 精讲TypeScript 预定义条件类型Predefined Conditional Types全文档教程The Concise TypeScript Book 精讲TypeScript 预定义条件型Predefined Conditional Types完整指南The Concise TypeScript Book 精讲TypeScript 预定义条件型Predefined Conditional Types完整文档教程The Concise TypeScript Book深入理解预定义条件类型Predefined Conditional TypesThe Concise TypeScript Book深入理解预定义条件类型Predefined Conditional Types 预定义条件类型Pr文档教程上一篇postgres_lsp 规则详解requireConcurrentIndexDeletion —— 用 DROP INDEX CONCURRENTLY 避免删除索引时锁表阻塞生产读写下一篇SQLite数据库集成指南使用Sequelize轻松管理本地数据存储创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表