在 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 中强大的工具,可以用来描述对象、函数、类的结构。结合 extends
、readonly
等功能,接口能帮助你在代码中更好地表达数据的形状,增强类型检查的能力。