在 TypeScript 中,接口(Interfaces)是一种强大的方式,用于定义对象、函数的参数以及类的实例的结构。接口的主要作用包括:
- 定义对象的结构:确保一个对象只有特定的结构才能被赋值给某个变量。
- 类型检查:在编译时检查对象是否符合接口定义的结构。
- 实现多态:允许使用同一个接口引用不同类型的对象。
- 扩展和重用:接口可以继承和扩展其他接口,实现结构的重用。
- 解耦合:接口可以作为高层的抽象,降低代码之间的耦合度。
示例代码
以下是使用 TypeScript 接口的一些示例,展示了接口的不同作用:
定义对象结构
typescript
interface User {
username: string;
age: number;
}
let user = {
username: "typeScripter",
age: 30
};
在这个例子中,User
接口定义了对象必须有 username
和 age
属性。
类型检查
typescript
function printUser(u: User) {
console.log(`Username: ${u.username}, Age: ${u.age}`);
}
printUser(user); // 正确
// printUser({ username: "incorrectUser" }); // 错误:缺少属性 'age'
实现多态
typescript
interface Animal {
makeSound(): void;
}
class Dog implements Animal {
makeSound() {
console.log("Woof!");
}
}
class Cat implements Animal {
makeSound() {
console.log("Meow!");
}
}
function animalSound(animal: Animal) {
animal.makeSound();
}
let dog = new Dog();
let cat = new Cat();
animalSound(dog); // Woof!
animalSound(cat); // Meow!
在这个例子中,Animal
接口允许 animalSound
函数接受任何实现了 Animal
接口的对象。
扩展和重用
typescript
interface Named {
name: string;
}
interface Aged extends Named {
age: number;
}
let person: Aged = {
name: "John Doe",
age: 45
};
在这个例子中,Aged
接口扩展了 Named
接口,重用了 name
属性的定义。
解耦合
接口可以用于定义函数的参数类型,使得函数与具体实现解耦。
typescript
interface Logger {
log(message: string): void;
}
class ConsoleLogger implements Logger {
log(message: string): void {
console.log(message);
}
}
function logMessage(logger: Logger, message: string) {
logger.log(message);
}
let consoleLogger = new ConsoleLogger();
logMessage(consoleLogger, "This is a log message.");
在这个例子中,logMessage
函数接受任何实现了 Logger
接口的对象,不关心具体的日志记录实现细节。
接口在 TypeScript 中扮演着重要角色,它们为数据结构提供了一个清晰的契约,增加了代码的可读性和可维护性,同时允许更高级的类型安全和多态特性。