接口声明实例拥有的方法/成员,而不是实现类拥有的。
例如检查Array 和ArrayConstructor 声明:
interface Array<T> {
length: number;
toString(): string;
toLocaleString(): string;
push(...items: T[]): number;
pop(): T | undefined;
...
[n: number]: T;
}
interface ArrayConstructor {
new (arrayLength?: number): any[];
new <T>(arrayLength: number): T[];
new <T>(...items: T[]): T[];
(arrayLength?: number): any[];
<T>(arrayLength: number): T[];
<T>(...items: T[]): T[];
isArray(arg: any): arg is Array<any>;
readonly prototype: Array<any>;
}
如您所见,Array 具有存在于任何数组实例上的方法/成员:
let a = [];
a.push(1, 2, 3);
console.log(a.length);
但是ArrayConstructor 具有Array 本身存在的成员/方法:
console.log(Array. prototype);
console.log(Array.isArray(9));
构造函数是“静态”部分的一部分,这就是它们在ArrayConstructor 中声明的原因。
例如,如果您在接口上声明构造函数,那么实现该接口就会遇到问题:
interface MyInterface {
constructor();
getName(): string;
}
class MyClass implements MyInterface {
constructor() {}
getName() { return "name" };
}
错误:
类“MyClass”错误地实现了接口“MyInterface”。类型
属性“构造函数”不兼容。类型“功能”不是
可分配给类型 '() => void'。类型“功能”不匹配
签名 '(): any'。