接口是 TypeScript 的核心特性之一,用于定义对象的形状、函数类型、类结构等。接口提供了一种强大的方式来定义契约。
接口定义了一组属性和方法的规范,任何实现该接口的对象都必须遵循这个规范。
interface User {
id: number
name: string
email: string
}
function printUser(user: User): void {
console.log(`${user.name} <${user.email}>`)
}
printUser({ id: 1, name: "张三", email: "zhangsan@example.com" })
interface Product {
id: number
name: string
price: number
}
const product: Product = {
id: 1,
name: "苹果",
price: 5,
stock: 100 // 错误:多余的属性
}
interface Repository<T> {
findById(id: number): Promise<T | null>
save(entity: T): Promise<T>
delete(id: number): Promise<void>
}
interface ApiResponse<T> {
code: number
message: string
data: T
timestamp: number
}
| 特性 | 说明 |
|---|---|
| 可选属性 | 使用 ? 标记 |
| 只读属性 | 使用 readonly 修饰 |
| 函数类型 | 定义函数签名 |
| 可索引类型 | 定义索引签名 |
| 类类型 | 定义类的结构 |
| 接口继承 | 使用 extends 继承 |
| 文章 | 说明 |
|---|---|
| 接口基础 | 基本定义和使用 |
| 可选属性 | 可选的属性定义 |
| 只读属性 | 不可修改的属性 |
| 函数类型接口 | 定义函数类型 |
| 可索引类型 | 数组和字典类型 |
| 类类型接口 | 定义类的结构 |
| 接口继承 | 接口的继承关系 |
// 接口
interface User {
name: string
age: number
}
// 类型别名
type UserType = {
name: string
age: number
}
主要区别:
| 特性 | 接口 | 类型别名 |
|---|---|---|
| 可以被扩展 | 是 | 是 |
| 可以被实现 | 是 | 是 |
| 声明合并 | 支持 | 不支持 |
| 联合类型 | 不支持 | 支持 |
| 元组类型 | 不支持 | 支持 |
对于对象类型,优先使用接口:
interface User {
id: number
name: string
}
type Status = "pending" | "approved" | "rejected"
type ID = string | number
// 接口使用 PascalCase
interface UserProfile {}
// 类型别名也使用 PascalCase
type UserRole = "admin" | "user"