文档教程【免费下载链接】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点击查看免费下载导读泛型Generics是 TypeScript 类型系统的核心能力之一它让你能够编写可复用的组件与函数并使其同时适用于多种类型。本文以《The Concise TypeScript Book》第 56 章Generic对应印尼语版 website/src/content/docs/id-id/book/generics.md英文原版见 website/src/content/docs/book/generics.md为骨架系统讲解泛型函数、泛型类、extends约束、高阶函数类型推断与泛型上下文收窄并结合仓库中其他章节class.md 的Dengan Generic、exploring-the-type-system.md 的类型比较规则、infer-type-inference-in-conditional-types.md 的infer用法做源码级纵深扩充。读完本文你将能够熟练写出类型安全的可复用函数、容器类与函数组合工具并理解 TypeScript 泛型推断与收窄的底层机制。在本书的目录结构中泛型位于第 56 节紧跟在第 55 节 Class 之后、第 57 节 Tipe Struktural yang Dihapus 之前属于系统类型 高级特性知识链的关键一环见 table-of-contents.md。一、什么是泛型为什么需要它泛型Generics允许你创建可复用的组件和函数让它们能够处理多种不同的类型。借助泛型你可以将类型本身参数化——对类型、函数和接口进行参数化——使它们无需事先明确指定具体类型就能作用于不同的数据类型。泛型的核心价值在于让代码更灵活、更可复用同时保持类型安全同一段逻辑可以服务于string、number乃至自定义对象而编译器依然能在编译期检查你的每一次调用是否合法。这与仓库中 exploring-the-type-system.md 所阐述的类型即集合思想一脉相承泛型相当于把集合也变成参数让函数签名描述一类结构关系而非某一具体集合。该章节还特别指出——泛型参数未指定时所有未指定的参数会被当作any处理例如type X T(x: T) T; type Y K(y: K) K; let x: X x x; let y: Y y y; x y; // Valid这说明泛型签名的比较发生在结构层面与具体的类型参数无关。二、泛型类型Generic Type尖括号语法与类型推断定义泛型类型时使用尖括号指定类型参数。最简单的形式是恒等函数function identityT(arg: T): T { return arg; } const a identity(x); // a: x const b identity(123); // b: 123这里T是一个类型参数type parameter调用时 TypeScript 会自动推断它的具体值identity(x)推断T stringidentity(123)推断T number因此返回值类型与入参类型完全一致。泛型同样适用于箭头函数此时T,末尾的逗号用于在.tsx文件中消歧避免编译器把T误解析为 JSX 标签const getLen T,(data: ReadonlyArrayT) data.length; const len getLen([1, 2, 3]); // 3注意这里使用了ReadonlyArrayT即readonly T[]它保证函数只读取数据、不修改数组是只读语义在泛型签名中的典型应用。data.length返回number因此len的类型是number。推断机制补充TypeScript 的泛型推断遵循最佳公共类型原则——当编译器无法从一个位置确定类型参数时会综合所有使用点寻找公共超类型。仓库 exploring-the-type-system.md 的Inferensi Lebih Lanjut一节给出了对应示例let x [1, x, 1, null]推断为(string | number | null)[]若无法找到公共类型则退化为联合类型。泛型推断与这一机制共享同一套类型分析管线。2.1 显式指定类型参数大多数场景下可以省略类型参数让编译器推断但在需要约束返回值、或推断结果不理想时也可以显式传入const c identitystring(x); // 显式指定 T string显式指定在类型参数无法从参数推断例如类型参数只出现在返回值中时尤为重要。三、泛型类Generic Class类型安全的容器泛型同样可以应用于类。通过类型参数类可以作用于多种类型同时保持类型安全——这正是创建可复用类定义的关键手段class ContainerT { private item: T; constructor(item: T) { this.item item; } getItem(): T { return this.item; } } const numberContainer new Containernumber(123); console.log(numberContainer.getItem()); // 123 const stringContainer new Containerstring(hello); console.log(stringContainer.getItem()); // helloContainerT的item属性、构造参数与getItem()返回值全部绑定到同一个类型参数T。实例化时传入具体类型new Containernumber(123)得到只能存放number的容器new Containerstring(hello)得到只能存放string的容器——同一份类定义两种截然不同的安全约束。仓库佐证这一模式在第 55 章 class.md 的### Dengan Generic小节以更完整的形式出现额外增加了setItem方法class ContainerT { private item: T; constructor(item: T) { this.item item; } getItem(): T { return this.item; } setItem(item: T): void { this.item item; } } const container1 new Containernumber(42); console.log(container1.getItem()); // 42 const container2 new Containerstring(Hello); container2.setItem(World); console.log(container2.getItem()); // World对照可见泛型类不仅允许读取还允许以同一类型安全地写入任何setItem传入错误类型的调用都会在编译期报错。四、泛型约束Generic Constraints用 extends 限定类型边界泛型参数可以用extends关键字约束后跟该类型参数必须满足的类型或接口。约束让编译器知道T至少具备某些成员从而允许你在函数体内安全地访问它们const printLen T extends { length: number }(value: T): void { console.log(value.length); }; printLen(Hello); // 5 printLen([1, 2, 3]); // 3 printLen({ length: 10 }); // 10 printLen(123); // InvalidT extends { length: number }表示T必须是具有length: number属性类型的子类型。因此stringlength: number、数组length: number、以及显式带length: number属性的对象字面量都合法而number123没有length属性编译器直接拒绝。若去掉这个约束函数体内访问value.length会报错——编译器在只知道T无任何结构信息时不允许你做任何属性访问。语义延伸在仓库 exploring-the-type-system.md 的Tipe sebagai Himpunan一节中extends被精确定义为集合论中的子集关系T1 ⊆ T2。书中特别提醒此处的extends与面向对象中的类继承无关它描述的是类型结构上的包含关系。这一点对理解泛型约束至关重要——约束不是继承某个类而是类型参数必须是某结构的子类型。4.1 泛型约束与条件类型的协同约束与条件类型conditional types经常配合使用。仓库 conditional-types.md 展示了T extends X ? A : B的三元条件形态type IsArrayT T extends any[] ? true : false; const myArray [1, 2, 3]; const myNumber 42; type IsMyArrayAnArray IsArraytypeof myArray; // true type IsMyNumberAnArray IsArraytypeof myNumber; // falseextends在这里同样表达子集关系若T是any[]的子集则返回true分支否则返回false分支。五、高阶函数类型推断泛型参数的传播TypeScript 3.4 特性原文档特别强调了一个源自 TypeScript 3.4 RC 的重要泛型特性——高阶函数类型推断higher-order function type inference编译器能够把泛型类型参数从外层函数传播到返回的函数类型中。declare function pipeA extends any[], B, C( ab: (...args: A) B, bc: (b: B) C ): (...args: A) C; declare function listT(a: T): T[]; declare function boxV(x: V): { value: V }; const listBox pipe(list, box); // T(a: T) { value: T[] } const boxList pipe(box, list); // V(x: V) { value: V }[]逐行解读pipe接收两个函数ab把A类型参数组映射为Bbc把B映射为C返回一个新的函数接受A并产生C。约束A extends any[]表示A必须是元组/数组类型rest 参数要求。list是泛型函数(a: T) T[]box也是泛型函数(x: V) { value: V }。pipe(list, box)时编译器推断B T[]于是返回值类型是(a: T) { value: T[] }——内部函数box的类型参数V被绑定到T[]而不是退化为any。pipe(box, list)同理得到(x: V) { value: V }[]。这一特性使类型安全的 point-free无点风格编程成为可能——这是函数式编程中常见的组合技巧先组合函数再在最后一步传入数据全程保持类型信息不丢失。在 TypeScript 3.4 之前这类组合的中间类型会因无法传播而退化成any或报错。实现支撑该机制与类型比较按结构进行的规则一致。仓库 exploring-the-type-system.md 指出泛型类型在应用参数后才按最终结构参与比较未使用的类型参数不参与结构比较已使用的类型参数则参与最终结构判定。pipe之所以能推断出精确签名正是因为编译器会在推断过程中先实例化内层泛型函数再把结果类型代入外层签名继续求解。六、泛型的上下文收窄Generic Contextual Narrowing上下文收窄contextual narrowing是 TypeScript 让编译器根据泛型参数的实际使用上下文把T收窄为更具体类型的机制。它在条件语句中处理泛型值时尤其有用function processT(value: T): void { if (typeof value string) { // 在此分支中value 被收窄为 string console.log(value.length); } else if (typeof value number) { // 在此分支中value 被收窄为 number console.log(value.toFixed(2)); } } process(hello); // 5 process(3.14159); // 3.14尽管value的静态类型是泛型T但typeof守卫让编译器在每个分支内把T收窄为对应的具体类型string分支可以安全调用.lengthnumber分支可以安全调用.toFixed(2)。这就是上下文驱动收窄——类型参数本身没有变但编译器在当前控制流中记住了更精确的约束。机制补充这与非泛型场景下的类型收窄narrowing共享同一套控制流分析。仓库 exploring-the-type-system.md 的Penyempitan Tipe一节列出了多种收窄途径条件语句if/switch、提前throw或return、instanceof、in、typeof、Array.isArray()等。此外narrowing.md 系统讲解了typeoftype guard、truthiness 收窄、等式收窄、in操作符收窄与instanceof收窄泛型上下文收窄正是这些通用机制在泛型函数中的自然延伸——先收窄类型参数再在收窄后的分支内安全访问成员。值得强调的是上下文收窄对T的收窄是局部的、分支内的。离开该分支后value的静态类型依然是T不会把收窄结果污染到整个函数签名上。七、延伸infer 与泛型的类型级运算理解泛型后可以自然延伸到本书后续章节的类型级编程。infer关键字用于在条件类型中反向抽取泛型参数是泛型在类型空间的进阶应用见 infer-type-inference-in-conditional-types.mdtype ElementTypeT T extends (infer U)[] ? U : never; type Numbers ElementTypenumber[]; // number type Strings ElementTypestring[]; // stringT extends (infer U)[]的含义是如果T匹配元素类型为U的数组就把U推断出来作为结果。例如ElementTypestring[]推断U string返回string。结合 type-manipulation.md 的Tipe kondisional示例infer还可抽取函数参数类型type ExtractParamT T extends (param: infer P) any ? P : never; type MyFunction (name: string) number; type ParamType ExtractParamMyFunction; // string此外TypeScript 内置的大量工具类型PartialT、ReadonlyT、PickT, K、ReturnTypeT、ParametersT等完整列表见 type-manipulation.md 的Tipe Utilitas本质上都是用泛型 extendsinfer mapped type 实现的类型级函数——泛型是这一切的地基。八、泛型实践要点与常见陷阱结合全书内容总结几条实战要点能用推断就不显式标注绝大多数调用场景如identity(x)、getLen([1,2,3])编译器都能自动推断类型参数无需手动指定。约束是访问成员的前提泛型函数体内想访问.length、.toFixed()等成员必须先通过extends声明结构约束否则编译器拒绝访问。区分extends的两个语境在泛型约束中表示子类型/子集与类继承无关参见 exploring-the-type-system.md 的集合论解读。T,尾逗号用于.tsx消歧在 React/JSX 项目中定义泛型箭头函数时不可省略。优先使用ReadonlyArrayT表达只读意图让函数签名自文档化禁止调用方传入可变数组时意外修改数据。借助上下文收窄安全处理联合语义泛型参数 typeof/instanceof守卫可以在分支内获得精确类型。point-free 组合依赖高阶函数推断TS 3.4 起的类型参数传播让pipe/compose类工具保持完整类型信息。常见陷阱提醒不要为省事把所有泛型参数退化成any——那将失去本书 any-type.md 中反复强调的编译期保护也不要试图把泛型参数收窄的结果外推到分支之外使用编译器在离开分支后仍按T的原始约束处理。九、小结泛型是 TypeScript 从类型注解走向类型抽象的枢纽主题核心语法关键收益泛型类型function identityT(arg: T): T函数/类型参数化自动推断泛型类class ContainerT { ... }类型安全的可复用容器泛型约束T extends { length: number }在类型边界内安全访问成员高阶函数推断pipeA, B, C(...)point-free 组合的类型传播TS 3.4上下文收窄typeof/instanceof分支分支内获得精确类型掌握这五层能力你就能像本书其他章节如 class.md 的泛型类、type-manipulation.md 的类型级编程所展示的那样用最小的代码量写出最大复用度、且全程类型安全的 TypeScript。如需进一步学习可在仓库 downloads 目录获取本书的 PDF/EPUB 版本或在 website/src/content/docs/id-id/book 目录继续阅读印尼语版各章节完整章节导航见 table-of-contents.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 泛型Generics实战指南从类型参数到高阶函数推断The Concise TypeScript Book 泛型Generics实战指南从类型参数到高阶函数推断 导读 泛型Generics是 TypeS文档教程TypeScript 函数返回类型推断详解《The Concise TypeScript Book》函数返回类型推断精讲TypeScript 函数返回类型推断详解《The Concise TypeScript Book》函数返回类型推断精讲 《The Concise TypeS文档教程TypeScript 泛型Generics完全指南从基础语法到高阶类型推断——《The Concise TypeScript Book》实战解读TypeScript 泛型Generics完全指南从基础语法到高阶类型推断——《The Concise TypeScript Book》实战解读 泛型G文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
基于WordPress源码搭建摄影图集下载站与作品集展示实战 刚才后台还有朋友在问,手里攒了不少COS摄影图集,想搭个正规的写真作品展示站,但如果真从裸CMS开始写,少说也要一两周。而用WordPress整站源码加两套下载站模板来切,不仅能两天之内跑通,后续加功能、换模板、… · 2026/9/26 22:26:16
通讯一体式CRM:把坐席电话与客户管理融合的工作台 1. DeskcommCRM不是又一个客户管理软件,它解决的是"桌子上的那台电话"先聊点实际的。你回想一下,一家十几个人到上百人的销售或客服团队,每天的日常工作状态是什么样的?坐席面前摆着至少两样东西:一个用来通… · 2026/9/26 22:25:43
用关键链法优化汽车传感器项目进度:Python实战与缓冲管理 做汽车传感器项目进度管理的这几年,我最深的一个体会是:计划排得再漂亮,也架不住“帕金森定律”和“学生综合征”的双重夹击。帕金森定律就是活干得越快越会被拖满整个可用时间,学生综合征则是总觉得deadline还远、先歇会儿再干&a… · 2026/9/26 22:25:37
腾讯云wordpress安装避坑速查手册新手必看 腾讯云wordpress安装避坑速查手册新手必看 自己不会代码却想搭个网站,是不是对着黑底白字的终端界面就发怵?别慌,这篇腾讯云wordpress安装速查手册就是为你准备的。咱们不整那些虚头巴脑的理论,直接上干货,手把手带你把坑填平。很多新… · 2026/9/26 22:57:56
Claude Code 环境管理器(开源):用 Go + Wails 打造多环境切换面板 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 22:57:56
Linux账号权限管理从入门到实战:rwx、sudo与权限故障排查指南 做Linux运维这些年,账号和权限管理一直是我眼里最基础也最容易被忽视的一块。你可能会背一堆linux常用命令,却不知道每个文件和目录背后那串rwx到底在说什么;你也可能因为一次“无权限删除”、一个docker权限错误,被迫在群里求助。… · 2026/9/26 22:57:56
浏览器原生录音全链路:getUserMedia与MediaRecorder实战 简介:这份资源面向前端开发者,尤其是需要在PC端实现H5音频采集与上传的工程师,解决浏览器调用麦克风获取实时音频流、录制音频并上传后台的完整实现问题。包内共9个文件,以3个js脚本和2个html页面为核心,辅以1个mp3示例… · 2026/9/26 22:57:56
移动端PDF批注画板:Canvas叠加与坐标绑定实战 简介:这是一份面向移动端 H5 开发者的 Canvas 画板批注 PDF 预览实战资源,适合需要在小程序、WebView 或移动浏览器中实现 PDF 阅读与手写批注功能的初中级前端工程师。资源围绕 PDF.js 解析渲染与 Canvas 触控绘图两条主线展开,涵盖文档加载… · 2026/9/26 22:57:56
扬中网站建设如何防坑?看懂3份报价单再签字 扬中网站建设如何防坑?看懂3份报价单再签字 别急着付钱!找建站公司最头疼的不是技术难懂,而是怕被坑高价。很多老板拿到【建站报价】单,看着密密麻麻的项目,心里直打鼓:这一万块到底值不值?是不是把基础功能标了天价?… · 2026/9/26 22:57:49
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46