在 TypeScript 中,接口(Interface)是一种定义对象类型的方式,主要用来描述对象的结构。以下是一些常见的接口定义形式及用法:

1. 基本接口定义

interface User {
  id: number;
  name: string;
  email: string;
}

const user: User = {
  id: 1,
  name: "John Doe",
  email: "john.doe@example.com",
};

2. 可选属性

使用 ? 表示属性是可选的。

interface User {
  id: number;
  name: string;
  email?: string; // email 是可选的
}

const user: User = {
  id: 2,
  name: "Jane Doe",
};

3. 只读属性

使用 readonly 声明只读属性,无法修改。

interface Config {
  readonly apiKey: string;
  timeout: number;
}

const config: Config = {
  apiKey: "12345",
  timeout: 3000,
};

// config.apiKey = "67890"; // 会报错,因为 apiKey 是只读的

4. 动态属性(索引签名)

当属性名不确定时,可以使用索引签名。

interface Dictionary {
  [key: string]: string; // 属性名是字符串,值也是字符串
}

const dictionary: Dictionary = {
  hello: "world",
  ts: "TypeScript",
};

5. 函数类型

接口可以用来定义函数的结构。

interface AddFunction {
  (a: number, b: number): number; // 定义函数签名
}

const add: AddFunction = (a, b) => a + b;

6. 接口继承

一个接口可以继承另一个接口。

interface Person {
  name: string;
  age: number;
}

interface Employee extends Person {
  position: string;
}

const employee: Employee = {
  name: "Alice",
  age: 25,
  position: "Developer",
};

7. 混合类型接口

接口可以同时描述对象和函数。

interface Counter {
  (start: number): void; // 函数签名
  increment(): number; // 方法
  reset(): void; // 方法
}

const counter: Counter = (function (start: number) {
  let value = start;
  const counter = function (start: number) {
    value = start;
  } as Counter;
  counter.increment = () => ++value;
  counter.reset = () => { value = 0; };
  return counter;
})(0);

counter(10);
counter.increment();
counter.reset();

8. 接口和类的结合

类可以实现接口,用来确保类具有某些结构。

interface Animal {
  name: string;
  speak(): void;
}

class Dog implements Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} says woof!`);
  }
}

const dog = new Dog("Buddy");
dog.speak();

总结

接口是 TypeScript 中强大的工具,可以用来描述对象、函数、类的结构。结合 extendsreadonly 等功能,接口能帮助你在代码中更好地表达数据的形状,增强类型检查的能力。15.webp