在接口中设置构造函数

时间:2016-06-27 07:33:30

标签: typescript typescript1.8

我有一个接口和一个实现它的类

export interface ITooltip {
    new(elem: HTMLElement, options?: ITooltipOptions);
    show(): void;
    hide(): void;
    toggle(): void;
}

export class Tooltip implements ITooltip {

    constructor(private  elem: HTMLElement, private options?: ITooltipOptions) {
    }

    ....
}

但是在控制台中我有一个错误:

Class 'Tooltip' incorrectly implements interface 'ITooltip'.
  Type 'Tooltip' provides no match for the signature 'new (elem: HTMLElement, options?: ITooltipOptions): any'

我不明白为什么会发生这种错误。

2 个答案:

答案 0 :(得分:1)

据我所知,你无法组合类实现的接口和类构造函数接口。

这有效:

export interface ITooltip {
    show(): void;
    hide(): void;
    toggle(): void;
}

export type TooltipConstructor = { new(elem: HTMLElement, options?: ITooltipOptions): Tooltip };

export class Tooltip implements ITooltip {
    constructor(private  elem: HTMLElement, private options?: ITooltipOptions) {}

    show(): void {}
    hide(): void {}
    toggle(): void {}
}

code in playground

答案 1 :(得分:0)

您的代码中有几件事情:

首先在Typescript中,您的类必须提供界面中定义的所有字段和函数。这有时候很乏味。如果你想避免这种情况并且它不会破坏你的结构,你可以使用extends而不是implements,然后你就不需要重新定义所有东西了

其次,您不在接口中声明构造函数声明。因此,应删除new(....句子。

您的代码最终会看起来像这样:

export interface ITooltip {
    show(): void;
    hide(): void;
    toggle(): void;
}

export class Tooltip implements ITooltip {
    constructor(elem: HTMLElement, options?: ITooltipOptions) {}; 
    show(): void {};
    hide(): void {};
    toggle(): void {};           
}

无论如何,我建议你首先阅读打字稿的文档来理解这些概念