ARTICLE DETAIL

资讯详情

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

TypeScript 类型定义实战:Interface 与 Type 的语法、差异与选型指南

TypeScript 类型定义实战:Interface 与 Type 的语法、差异与选型指南 文档教程【免费下载链接】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接口与type类型别名是描述对象结构的两大核心工具。本文基于《The Concise TypeScript Book》中 interface-and-type 章节系统讲解接口与类型的通用语法、类型定义的常见形态基本类型、对象、联合、交集并结合同仓库的差异对比、合并扩展等章节深入剖析二者在声明合并、继承扩展、复杂类型表达上的关键区别。读完本文你将掌握如何在日常开发中为对象、函数与组合类型写出清晰、可维护的类型定义并能根据具体场景正确选择interface或type。接口与类型的通用语法在 TypeScript 中接口用于定义对象的结构明确指定一个对象必须拥有的属性名称、类型以及方法签名。定义接口的通用语法如下interface InterfaceName { property1: Type1; // ... method1(arg1: ArgType1, arg2: ArgType2): ReturnType; // ... }类型别名的定义方式与之相似只是使用type关键字并配合赋值语法type TypeName { property1: Type1; // ... method1(arg1: ArgType1, arg2: ArgType2): ReturnType; // ... };对语法中的每个部分逐项拆解interface InterfaceName或type TypeName定义接口或类型的名称。接口通过声明块组织成员类型别名则通过将右侧的对象字面量类型赋给左侧名称。property1: Type1指定接口的属性及其对应的类型。可以定义多个属性每个属性之间用分号分隔。method1(arg1: ArgType1, arg2: ArgType2): ReturnType;指定接口的方法。方法由名称、括号内的参数列表每个参数标注类型以及返回值类型组成。同样可以定义多个方法彼此用分号分隔。一个完整的接口示例interface Person { name: string; age: number; greet(): void; }与之等价的形式用类型别名书写type TypeName { property1: string; method1(arg1: string, arg2: string): string; };在 TypeScript 中类型types用于定义数据的形态并强制执行类型检查。根据具体的使用场景有若干常见的类型定义语法下面逐一展开。类型定义的各种形态基本类型Tipos Básicos基本类型注解直接写在变量声明之后适用于数字、布尔、数组、元组等场景let myNumber: number 123; // number 类型 let myBoolean: boolean true; // boolean 类型 let myArray: string[] [a, b]; // 字符串数组 let myTuple: [string, number] [a, 123]; // 元组tuple值得注意的是TypeScript 在推断简单类型时表现很好正如 type-annotations 章节 所指出的这类简单注解在大多数情况下并非必需更多是用于明确意图或约束边界。该章节还给出了一套实用建议优先为函数的参数与返回值标注类型签名但不必为函数体内的局部变量逐一注解对对象字面量则始终建议显式给出类型。对象与接口Objetos e Interfaces对象形态的类型既可以通过内联对象字面量语法直接书写也可以通过interface或type命名const x: { name: string; age: number } { name: Simon, age: 7 };关于对象类型的两种主要定义方式object-types 章节 做了进一步说明interface定义对象的形状指定属性名称、类型及其可选性。type alias与 interface 类似定义对象的形状但它还能基于现有类型或现有类型的组合创建全新的自定义类型包括联合类型、交集类型等复杂类型。interface User { name: string; age: number; email?: string; } type Point { x: number; y: number; };对象类型也可以匿名定义直接在函数参数处内联const sum (x: { a: number; b: number }) x.a x.b; console.log(sum({ a: 5, b: 1 }));若对象中的某些属性可有可无可以在属性名后加问号?将其标记为可选。如 optional-properties 章节 所示可选属性还可以配合解构默认值使用type X { a: number; b?: number; // 可选 }; const x ({ a, b 100 }: X) a b;联合类型与交集类型Tipos União e Interseção联合类型Union Type表示一个值可以是若干类型中的任意一种用符号|连接每种可能的类型。关于联合类型的完整定义可参考 union-type 章节type MyType string | number; // 联合类型 let myUnion: MyType hello; // 可以是字符串 myUnion 123; // 也可以是数字交集类型Intersection Type表示一个值同时拥有两个或多个类型的全部属性用符号连接参见 intersection-types 章节type TypeA { name: string }; type TypeB { age: number }; type CombinedType TypeA TypeB; // 交集类型 let myCombined: CombinedType { name: John, age: 25 }; // 同时具有 name 和 age 属性的对象Interface 与 Type 的关键差异虽然接口与类型别名在定义对象结构时功能高度重叠但二者在以下三个维度上存在本质差异详见 differences-between-type-and-interface 章节。差异一声明合并Mesclagem de declarações接口支持声明合并你可以用同一个名字定义多个接口TypeScript 会自动将它们合并为包含全部属性与方法的单一接口。类型别名则不支持声明合并。这一特性在「不修改原始定义、为现有类型补充额外功能或修正缺失/错误类型」的场景下非常有用interface A { x: string; } interface A { y: string; } const j: A { x: xx, y: yy, };合并与扩展是处理类型时两个截然不同的概念merging-and-extension 章节 对此有专门论述合并merging允许你把多个同名声明组合成单一定义扩展extension则允许从已有类型或接口继承以创建新类型无需改动原始定义即可追加属性或方法。实际开发中声明合并常被用于为第三方库的类型打补丁如为全局对象扩展方法或为配置文件、环境变量等模块增强类型。差异二扩展其他类型/接口Estendendo outros tipos/interfaces类型与接口都可以扩展其他类型或接口但语法不同接口使用extends关键字继承其他接口的属性与方法但接口不能直接扩展复杂类型如联合类型interface A { x: string; y: number; } interface B extends A { z: string; } const car: B { x: x, y: 123, z: z, };类型使用操作符把多个类型组合成单个类型交集interface A { x: string; y: number; } type B A { j: string; }; const c: B { x: x, y: 123, j: j, };关于扩展的方向性extending-types 章节 给出了三条关键规则可以扩展单个接口也可以一次从多个类型扩展多继承interface X { a: string; } interface Y extends X { b: string; } interface A { a: string; } interface B { b: string; } interface Y2 extends A, B { y: string; }extends关键字只适用于接口和类对类型别名请使用交集type A { a: number; }; type B { b: number; }; type C A B;可以用接口扩展一个类型别名但反过来不行——类型别名无法用extends扩展接口type A { a: string; }; interface B extends A { b: string; }差异三联合类型与交集类型的表达能力Tipos União e Interseção类型别名在定义联合与交集类型时更加灵活用|可以轻松创建联合类型用可以创建交集类型。接口虽然也能间接表达联合类型但不具备内建的交集类型支持。因此凡是涉及组合类型的场景都应使用typetype Department dep-x | dep-y; // 联合类型 type Person { name: string; age: number; }; type Employee { id: number; department: Department; }; type EmployeeInfo Person Employee; // 交集类型接口表达联合类型的一种方式是「间接实现」——先定义多个接口再用类型别名把它们组合成联合interface A { x: x; } interface B { y: y; } type C A | B; // 接口的联合但请注意这里的C只能以type形式存在interface C A | B在语法上是不合法的。如何选择interface 还是 type综合上述差异可以归纳出面向实战的选型建议需要声明合并 / 扩展现有类型如为全局或第三方类型打补丁时优先使用interface。它是 TypeScript 为「结构化类型契约」设计的原生产物extends单继承、多继承语义清晰。需要表达联合类型、交集类型、映射类型、条件类型或元组等组合形态时只能使用type。这也是 differences-between-type-and-interface 章节 反复强调的结论类型别名在组合类型上拥有接口不具备的表达力。单纯描述一个对象/函数的形状时二者皆可。此时选择标准主要取决于团队约定与扩展预期若未来可能通过合并来增强选interface若更看重组合能力与一致性选type。正如 type-annotations 章节 的建议——对对象字面量始终显式添加类型能让联合/交集组合的对象形态更易读、更可维护。在本书中继续深入本文内容是《The Concise TypeScript Book》类型体系章节的组成部分。若想进一步巩固建议沿着以下仓库路径继续阅读interface-and-type.md英文原版接口与类型的通用语法基准differences-between-type-and-interface.md差异三要素的权威对比union-type.md 与 intersection-types.md联合、交集类型的精确定义extending-types.md 与 merging-and-extension.md扩展与合并的完整规则object-types.md、optional-properties.md、type-annotations.md对象形态、可选属性与注解风格的最佳实践。这些章节与本仓库其他类型主题如 type-from-value、type-manipulation、mapped-types 等共同构成一套由浅入深的 TypeScript 类型学习路径可作为团队内训或自学的参考资料。赞分享文档教程【免费下载链接】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 与 Type 类型定义详解语法、实战与选择指南TypeScript 的 Interface 与 Type 类型定义详解语法、实战与选择指南 本文以《The Concise TypeScript Book》文档教程The Concise TypeScript Bookinterface 与 type 类型定义完全指南——语法、差异与工程选型The Concise TypeScript Bookinterface 与 type 类型定义完全指南——语法、差异与工程选型 本文基于 The Conci文档教程The Concise TypeScript Book 指南type 与 interface 的六大差异与选型实战The Concise TypeScript Book 指南type 与 interface 的六大差异与选型实战 type 类型别名与 interfac文档教程上一篇Translumo 免费实时屏幕翻译从框选到开翻只需三步下一篇LX Music 桌面版多源聚合音乐播放器实用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表