# 第4章:对象与接口
## 对象类型基础
### 1. 对象类型的定义
在 TypeScript 中,对象类型用于描述一个对象的结构,包括其属性和方法。可以通过直接声明或接口(Interface)来定义对象类型。
```typescript
// 直接声明对象类型
let user: {
name: string;
age: number;
isActive: boolean;
};
// 初始化对象
user = {
name: "Alice",
age: 30,
isActive: true,
};
2. 对象属性的类型
对象属性可以是以下类型:
- 基本类型:
string、number、boolean等。 - 复合类型:数组、其他对象、函数等。
- 可选属性:通过
?标记属性为可选。
let book: {
title: string;
author?: string; // 可选属性
pages: number;
tags: string[]; // 数组类型
};
book = {
title: "TypeScript Handbook",
pages: 200,
tags: ["programming", "typescript"],
};
3. 对象方法的类型
对象可以包含方法,方法的类型可以通过函数签名定义。
let calculator: {
add: (x: number, y: number) => number;
subtract: (x: number, y: number) => number;
};
calculator = {
add: (x, y) => x + y,
subtract: (x, y) => x - y,
};
4. 只读属性
通过 readonly 关键字可以标记属性为只读,初始化后不可修改。
let config: {
readonly apiUrl: string;
maxRetries: number;
};
config = {
apiUrl: "https://api.example.com",
maxRetries: 3,
};
// config.apiUrl = "new-url"; // 错误:无法修改只读属性
5. 动态属性与索引签名
如果对象的属性名是动态的,可以使用索引签名(Index Signature)定义。
let dynamicObject: {
[key: string]: number | string; // 键是字符串,值是 number 或 string
};
dynamicObject = {
score: 100,
name: "Bob",
age: 25, // 允许,因为 age 是 number
};
6. 类型检查与错误示例
TypeScript 会对对象类型进行严格检查,以下是一个错误示例:
let invalidUser: {
name: string;
age: number;
};
invalidUser = {
name: "Charlie",
// 错误:缺少 age 属性
};
7. 实际应用场景
对象类型常用于:
- 定义 API 返回的数据结构。
- 描述配置对象的形状。
- 作为函数的参数或返回值类型。
function printUserInfo(user: { name: string; age: number }) {
console.log(`Name: ${user.name}, Age: ${user.age}`);
}
printUserInfo({ name: "Dave", age: 40 });
总结
对象类型是 TypeScript 的核心特性之一,通过明确对象的属性和方法类型,可以显著提高代码的可读性和安全性。后续章节将介绍如何通过接口(Interface)进一步优化对象类型的定义。
