简述TypeScript 中的接口 ?
TypeScript中的接口(Interfaces)是一个非常强大的特性,用于定义对象的形状(shape),即对象中应该包含哪些属性和方法以及它们的类型。接口在TypeScript中主要用于静态类型检查,帮助开发者在编译时期捕获错误,而不是在运行时。
接口定义了一套契约,对象可以实现(implement)一个或多个接口,类可以通过接口来定义自己的公共API。接口只存在于TypeScript的类型检查阶段,并不编译成JavaScript代码。
基本用法
在最简单的形式中,接口可以用来描述一个对象需要有哪些属性和属性的类型:
interface Person {
name: string;
age: number;
}
let john: Person = { name: "John Doe", age: 30 };
在这个例子中,Person
接口定义了一个对象,这个对象有两个属性:name
和age
,分别是字符串和数字类型。任何赋值给john
变量的对象都必须符合Person
接口的形状。
可选属性
接口的属性不必全部是必须的,你可以通过在属性名后加上?
标记来指定属性为可选:
interface Person {
name: string;
age?: number; // 可选属性
}
let jane: Person = { name: "Jane Doe" }; // 正确,age是可选的
方法
接口同样可以描述对象中的方法:
interface Greeter {
greet(): void;
}
class EnglishGreeter implements Greeter {
greet() {
console.log("Hello!");
}
}
在这个例子中,Greeter
接口定义了一个greet
方法,EnglishGreeter
类通过实现这个接口,承诺提供一个greet
方法的实现。
接口继承
接口还可以继承一个或多个其他接口,这使得我们可以从其他接口复制成员到当前接口,创建出复杂的类型:
interface Named {
name: string;
}
interface Logged {
log(name: string): void;
}
interface Person extends Named, Logged {
age: number;
}
在这个例子中,Person
接口继承了Named
和Logged
接口,因此任何Person
类型的对象都需要符合这三个接口定义的形状。
动态属性
接口还可以用来定义具有某种模式的对象,其中对象的属性名是动态的:
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
这个StringArray
接口表明,当使用数字索引去获取StringArray
的时候,会得到一个字符串类型的返回值。
通过这些特性,TypeScript的接口为构建健壮的类型系统和促进代码的可读性和维护性提供了强大的工具。