我正在尝试了解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)声明实例具有的方法/成员,而不声明实现类所具有的方法/成员。

例如,检查ArrayArrayConstructor声明:

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" };
}

错误:

07-26 01:22