文档教程【免费下载链接】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 仓库中的「Typy obiektowe / Object Types」章节波兰语版与英文原版同源展开系统讲解 TypeScript 对象类型的本质、interface与type两种定义方式、匿名对象类型并结合仓库内 可选属性、只读属性、索引签名、接口与类型的差异、类型注解 与判别联合 等姊妹章节为开发者提供一套从入门到实战的完整参考。一、什么是对象类型在 TypeScript 中对象类型Object Types用于描述一个对象的形状shape。通俗地说它规定了对象中每个属性的名称每个属性对应的类型每个属性是必需的required还是可选的optional。借助对象类型编译器可以在开发阶段就捕获属性名写错类型不匹配缺少必填字段等一类常见错误从而把运行时问题提前暴露到编译期。对象类型并非只能描述普通对象它同样适用于函数参数的结构约束。例如 类型注解 章节指出注解的主要价值在于约束数据形状TypeScript 对简单变量通常可以很好地完成类型推断但对对象字面量始终建议显式标注类型。二、定义对象类型的两种主要方式在 TypeScript 中定义对象类型有两条主路径interface接口与type类型别名。二者在描述对象结构时语法高度相似但能力边界有所不同。2.1 使用 interface 定义对象结构interface通过指定属性的名称、类型和可选性来定义对象的形状interface User { name: string; age: number; email?: string; }以上User接口声明了一个对象必须具备name: string与age: number两个必填属性而email?: string中的?表示该属性是可选的关于可选属性的细节见下文第三节。interface的通用语法在 Interface and Type 章节中有完整说明除了属性之外它还可以声明方法签名interface InterfaceName { property1: Type1; // ... method1(arg1: ArgType1, arg2: ArgType2): ReturnType; // ... }一个同时包含属性与方法的完整示例interface Person { name: string; age: number; greet(): void; }2.2 使用 type 别名定义对象结构type别名与interface类似同样可以定义对象形状但它的能力更广——可以基于现有类型或其组合创建全新的自定义类型包括联合类型union、交叉类型intersection以及其他复合类型type Point { x: number; y: number; };type的通用形式同样支持属性与方法type TypeName { property1: Type1; // ... method1(arg1: ArgType1, arg2: ArgType2): ReturnType; // ... };2.3 匿名对象类型对象类型不一定非要命名。你可以直接在函数参数位置内联写出对象的结构这种写法称为匿名对象类型适合一次性使用、无需复用的场景const sum (x: { a: number; b: number }) x.a x.b; console.log(sum({ a: 5, b: 1 })); // 6这段代码中参数x的类型被直接内联为{ a: number; b: number }函数体返回x.a x.b。这种写法在回调函数、事件处理器或临时数据结构中非常常见。练习提示可以结合 Interface and Type 章节中的基础类型示例将匿名对象类型与具名接口、类型别名对照使用体会三者在可读性与复用性上的差异const x: { name: string; age: number } { name: Simon, age: 7 };三、interface 与 type 的差异与取舍对象类型章节强调type可以组合出联合、交叉等复合类型这正是二者差异的入口。接口与类型的差异 章节对此做了详细对比可归纳为三点3.1 声明合并Declaration Merging接口支持声明合并可以多次声明同名interfaceTypeScript 会自动把它们合并成一个包含全部属性与方法的单一接口。这一特性在不修改原始定义的前提下为既有类型补充功能、修补缺失或不准确的类型时尤为有用interface A { x: string; } interface A { y: string; } const j: A { x: xx, y: yy, };而type不支持声明合并同名type重复声明会报错。3.2 扩展其他类型/接口两者都可以基于既有类型扩展但语法不同接口使用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, };3.3 联合与交叉类型的表达能力type在定义联合与交叉类型时更为灵活|运算符创建联合类型运算符创建交叉类型而接口没有内建的交叉类型支持仅能间接表达联合type 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; // 接口的联合选择建议当需要声明合并、面向对象式的继承扩展时优先interface当需要联合、交叉等复合类型或希望用别名简化复杂类型书写时优先type。两者在绝大多数描述普通对象结构的场景中可以互换。四、对象类型的可选属性与默认值对象类型章节中的email?: string是可选属性的典型示例。可选属性 章节进一步说明在属性名末尾添加问号?即可将其声明为可选type X { a: number; b?: number; // 可选属性 };可选属性意味着该键在对象字面量中可以缺失访问时需要配合运行时判断或默认值处理。仓库文档还演示了在函数参数解构时结合默认值的方式实现属性可选但取值有兜底的常见需求type X { a: number; b?: number; }; const x ({ a, b 100 }: X) a b;当传入的b缺失时b自动取默认值100这与 类型注解 中参数存在默认值时可以省略注解的规则如const sum (a 10, b: number) a b;互为印证。五、只读属性与深度不可变性边界除了必填/可选对象类型还可以表达属性不可重写。使用修饰符readonly可以阻止对属性再次赋值interface Y { readonly a: number; } type X { readonly a: number; }; type J Readonly{ a: number; }; type K { readonly [index: number]: string; };如 只读属性 章节明确强调的那样readonly只保证属性不能被重新写入并不提供整体不可变性total immutability的保证——即对象本身依然是可变的其嵌套子结构也不会被递归冻结。若需要真正的深层不可变应配合Object.freeze或深拷贝等运行时手段。六、索引签名动态键对象现实中的对象并不总是拥有固定属性集合如字典、映射、记录等场景需要动态键。TypeScript 支持以string、number和symbol作为索引签名type K { [name: string | number]: string; }; const k: K { x: x, 1: b }; console.log(k[x]); // x console.log(k[1]); // b console.log(k[1]); // b —— 与 k[1] 结果相同如 索引签名 章节所提醒JavaScript 会自动把number索引转换为string索引因此k[1]与k[1]访问到的是同一个属性。索引签名与readonly也可以组合使用见上文type K { readonly [index: number]: string; }用来表达字典一旦建立即不可修改的约束。七、对象类型的实战组合判别联合对象类型不只是独立的形状声明更是组合复杂类型的基础构件。将对象类型与联合类型结合即可构造出 TypeScript 中最实用的模式之一——判别联合Discriminated Unions用一个共同的字面量属性判别属性在运行时缩小联合的可能类型type Square { kind: square; // 判别属性 size: number; }; type Circle { kind: circle; // 判别属性 radius: number; }; type Shape Square | Circle; const area (shape: Shape) { switch (shape.kind) { case square: return Math.pow(shape.size, 2); case circle: return Math.PI * Math.pow(shape.radius, 2); } }; const square: Square { kind: square, size: 5 }; const circle: Circle { kind: circle, radius: 2 }; console.log(area(square)); // 25 console.log(area(circle)); // 12.566370614359172在上例中Square与Circle正是通过对象类型分别声明各自的结构再用type Shape Square | Circle组合为联合类型。switch (shape.kind)基于判别属性完成类型收窄后编译器在case square分支中知道shape一定是Square从而安全访问shape.size在case circle分支中安全访问shape.radius。整个模式的完整讲解见 判别联合 章节。八、小结围绕 The Concise TypeScript Book 的「对象类型」章节本文覆盖了如下知识链路主题核心要点仓库章节对象类型定义interface与type两种主要方式Object Types匿名对象类型函数参数内联结构如(x: { a: number; b: number }) ...Object Types声明合并接口支持、类型别名不支持Differences between Type and Interface扩展方式接口extends类型别名用交叉Differences between Type and Interface可选属性?标记 解构默认值兜底Optional Properties只读属性readonly防重写但不保证整体不可变Readonly Properties索引签名string/number/symbol动态键number键会被转成字符串Index Signatures判别联合对象类型 联合类型 判别属性收窄Discriminated Unions实践中可以遵循 类型注解 给出的总体原则注解类型签名函数的入参与返回但不必注解函数体内部的局部变量对象字面量则始终显式标注类型。掌握对象类型的两种定义方式及其修饰能力可选、只读、索引、组合是写出结构清晰、可维护、类型安全的 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点击查看免费下载相关推荐The Concise TypeScript Book 实战深入理解 TypeScript 对象类型Object Types的定义与使用The Concise TypeScript Book 实战深入理解 TypeScript 对象类型Object Types的定义与使用 对象类型Obj文档教程TypeScript 对象类型Object Types全面指南以 typ/typescript-book 为例的结构化类型体系TypeScript 对象类型Object Types全面指南以 typ/typescript book 为例的结构化类型体系 导读 对象类型是 Type文档教程The Concise TypeScript Book 精讲对象类型Object Types从定义到组合实战The Concise TypeScript Book 精讲对象类型Object Types从定义到组合实战 导读 对象类型是 TypeScript 类型文档教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考