拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

TypeScript 类型扩展完全指南:interface extends、多重继承与交叉类型实战(typescript-book)

TypeScript 类型扩展完全指南:interface extends、多重继承与交叉类型实战(typescript-book) 文档教程【免费下载链接】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》开源仓库中西班牙语文档 extending-types.md对应英文原版见 website/src/content/docs/book/extending-types.md为核心系统讲解 TypeScript 中扩展类型的四种核心手段interface的extends单继承与多继承、type的交叉类型、接口对类型别名的单向扩展以及泛型约束中的extends。读完本文你将能根据场景准确选择extends与写出可组合、可复用且类型安全的对象类型设计。一、接口的 extends从单一类型复制成员在原文档中interface的extends是最基础的类型扩展方式它允许新接口复制另一个类型的全部成员再追加自己的成员。原始示例interface X { a: string; } interface Y extends X { b: string; }这里Y拥有a继承自X与b自身声明两个属性等价于声明了{ a: string; b: string }的结构。下面是一个更接近实际业务的完整用例interface BasicUser { id: number; name: string; } interface AdminUser extends BasicUser { permissions: string[]; role: admin; } const admin: AdminUser { id: 1, name: Simon, permissions: [read, write, delete], role: admin, };要点extends是类型层面的继承编译后不产生任何运行时开销纯粹用于静态类型检查派生接口如AdminUser必须是超类型——即必须至少包含父接口的全部成员否则会报缺少属性的错误扩展可以逐层进行A extends BC extends A形成清晰的类型继承链。二、多重扩展同时继承多个接口原文档指出interface也可以从多个类型扩展interface A { a: string; } interface B { b: string; } interface Y extends A, B { y: string; }此时Y将A、B的所有成员与自身成员合并要求实现方同时满足三者的结构。这弥补了 TypeScript 类只能单继承的限制——类的单继承规则见 class.md但接口可以自由组合多个来源。典型用法是把可独立复用的小接口组合成领域模型interface HasName { name: string; } interface HasEmail { email: string; } interface Employee extends HasName, HasEmail { employeeId: string; department: string; }需要注意多重扩展时若多个父接口声明了同名但类型不兼容的属性会引发编译错误例如一个声明x: string、另一个声明x: numberTypeScript 无法自动调和冲突类型此时应改用组合或交叉类型方案。三、extends 的适用范围接口与类而非类型别名原文档给出了一个重要边界extends关键字只适用于interface和class对于type别名必须使用交叉类型type A { a: number; }; type B { b: number; }; type C A B;生成的是交叉类型Intersection Type它表示一个同时具备所有来源类型全部属性的值。这与接口继承在语义上等价type C A B要求C的值同时满足A和B的结构。仓库中 intersection-types.md 给出了交叉类型的完整定义与实例化示例type X { a: string; }; type Y { b: string; }; type J X Y; // Intersection const j: J { a: a, b: b, };实践建议简单对象结构的组合interface extends与type 均可用选其一即可当需要组合联合类型、元组、函数签名等复杂类型时只能使用type的/|接口无法表达这类结构这一点在 differences-between-type-and-interface.md 中有详细对比交叉类型允许覆盖式组合后出现的类型可以重新声明同名属性并给出更具体的类型这在接口继承中无法做到。四、接口扩展类型别名单向允许原文档最后一条规则是接口可以通过extends扩展一个类型别名但反过来类型别名去继承接口则不行type A { a: string; }; interface B extends A { b: string; }这条规则成立的前提是被扩展的type A必须是结构可确定的、能静态解析的对象类型object type。仓库的 object-types.md 指出类型别名与接口都用于描述对象的形状而接口不能extends联合类型这类无法静态展开的复杂类型。例如下面写法会报错type A { a: string } | { b: number }; // interface B extends A { } // Error接口不能扩展联合类型同时在 interface-and-type.md 中也可以看到interface与type声明对象形状的语法几乎一致属性加类型、方法加参数与返回类型这也是它们可以互相组合扩展的基础。五、extends 的另一重身份泛型约束extends在类型扩展之外还有一重重要职责——泛型约束。仓库的 generics.md 说明泛型参数可以通过extends限定其必须满足的类型形状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); // Invalid这里的T extends { length: number }表示任何具有数字类型length属性的类型字符串、数组、自定义对象均可通过而数字123被拒绝。这与接口继承共享同一关键字但语义是约束而非复制成员——理解这一点有助于阅读大量开源代码中的泛型签名。六、扩展与合并两个易混淆概念的辨析仓库的 merging-and-extension.md 专门区分了两个常被混用的概念合并Merging多个同名声明合并为一个定义。例如重复声明两次interface XTypeScript 会把两个块合并最终X同时拥有两块的成员interface X { a: string; } interface X { b: number; } const person: X { a: a, b: 7, };这种声明合并是interface独有的能力type别名不支持详见 differences-between-type-and-interface.md。它常用于为第三方库补充类型、或在不改动原定义的前提下扩展类型。扩展Extension从一个已有类型派生出新类型原始定义保持不动。这正是本文前面讨论的extends与interface Animal { name: string; eat(): void; } interface Bird extends Animal { sing(): void; }两者的关系可以概括为合并是同名叠加扩展是从既有类型派生新名类型。七、与类的继承、实现组合使用虽然extends也可用于类的继承class Dog extends Animal见 class.md但类型扩展最强大的地方在于与类体系配合接口继承类接口可以通过extends继承一个类的公开成员含public属性与方法签名用于描述实现了该类的对象形状类实现多个接口TypeScript 的类只能单继承一个基类但可以implements多个接口从多个来源获得结构契约interface Flyable { fly(): void; } interface Swimmable { swim(): void; } class FlyingFish implements Flyable, Swimmable { fly() { console.log(Flying...); } swim() { console.log(Swimming...); } }这正是接口多重扩展在实际项目中最重要的落地场景把能力拆成小型接口再通过组合extends组合接口、implements组合实现构造成完整的类。八、选型速查与小结需求场景推荐写法说明接口派生新接口interface B extends A {}支持单继承与多继承支持声明合并类型别名组合type C A B;交叉类型可组合联合类型等复杂结构接口复用类型别名interface B extends A {}单向允许A须为可解析的对象类型类型别名复用接口使用type C A B;别名不能用extends继承接口约束泛型参数T extends { length: number }extends在此表示约束而非继承扩展类的能力契约class X implements A, B {}弥补类单继承的限制总结而言extending-types.md 用最精简的四个示例勾勒出 TypeScript 类型扩展的完整边界接口用extends实现单/多继承类型别名用实现组合接口可以单向扩展类型别名而extends还兼任泛型约束。配合本仓库 table-of-contents.md 中Extending Types在类型系统章节的位置可将本文与交叉类型、接口与类型区别、合并与扩展、泛型等相邻主题intersection-types.md、interface-and-type.md、differences-between-type-and-interface.md、merging-and-extension.md、generics.md串联起来形成完整的类型系统知识闭环。中文读者还可对照仓库的 zh-cn 版本 extending-types.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点击查看免费下载相关推荐TypeScript 类型扩展全指南interface extends、多重继承与交集类型实战The Concise TypeScript Book 精读TypeScript 类型扩展全指南interface extends、多重继承与交集类型实战The Concise TypeScript Book 精读文档教程TypeScript 类型扩展Extending Types完全指南interface 继承、多重扩展与交叉类型TypeScript 类型扩展Extending Types完全指南interface 继承、多重扩展与交叉类型 导读 在 TypeScript 的类型系文档教程TypeScript 类型扩展全解析interface 继承与交集类型的正确用法The Concise TypeScript Book 实战指南TypeScript 类型扩展全解析interface 继承与交集类型的正确用法The Concise TypeScript Book 实战指南 本文是《文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表