# 接口与对象类型

URL: https://caijiao.org/ts/part1/interface-object
Source: docs/ts/part1/interface-object.md
Description: TypeScript 中接口（interface）与对象类型的使用方法，包括 interface 与 type 的区别、可选与只读属性、索引签名以及函数类型定义等内容。

接口（`interface`）是 [TypeScript](/ts/) 中用于定义对象结构的核心机制，也可以使用 `type` 类型别名定义对象类型。本节将介绍它们的区别及实际用法。

## interface 与 type 的区别

### interface

```ts
interface Person {
  name: string;
  age: number;
}
```

### type

```ts
type Person = {
  name: string;
  age: number;
};
```

区别总结：

| 特性                | interface           | type                |
| ------------------- | ------------------- | ------------------- |
| 对象类型定义        | ✅ 支持             | ✅ 支持             |
| 联合类型 / 基本类型 | ❌ 不支持           | ✅ 支持             |
| 扩展方式            | extends             | &（交叉类型）       |
| 可重复定义并合并    | ✅ 支持（声明合并） | ❌ 不支持（会报错） |

> 实际开发中，推荐优先使用 `interface` 定义对象结构，使用 `type` 处理联合类型或复杂组合。

## 可选属性、只读属性、索引签名

### 可选属性（`?`）

```ts
interface User {
  name: string;
  age?: number; // 可选
}
```

### 只读属性（`readonly`）

```ts
interface Config {
  readonly port: number;
}
```

### 索引签名

用于动态定义属性：

```ts
interface Dictionary {
  [key: string]: string;
}
```

## 函数类型定义

接口和类型别名都可以用于函数签名声明：

```ts
interface Add {
  (a: number, b: number): number;
}

const add: Add = (x, y) => x + y;
```

或使用 type：

```ts
type Subtract = (a: number, b: number) => number;
```
