我正在尝试了解Typescript中的界面主题
当我遇到类类型时,我从official docs获得了此代码
interface ClockConstructor {
new (hour: number, minute: number);
}
class Clock implements ClockConstructor {
currentTime: Date;
constructor(h: number, m: number) { }
}
我可以理解
Clock
与签名new (hour: number, minute: number);
不匹配,这就是我们在那里出现错误的原因。但是在文档中,解释是我无法理解的。它以这种方式进行:
任何解释将不胜感激。
最佳答案
接口(interface)声明实例具有的方法/成员,而不声明实现类所具有的方法/成员。
例如,检查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)上声明构造函数,则在实现该接口(interface)时会遇到问题:
interface MyInterface {
constructor();
getName(): string;
}
class MyClass implements MyInterface {
constructor() {}
getName() { return "name" };
}
错误: