2016-06-27 3 views
1

У меня есть интерфейс и класс, которые реализуют егоНабор конструктора в интерфейсе

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' 

Я не понимаю, почему эта ошибка происходит.

ответ

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)

+0

Я думаю, что это лучшее решение. благодаря – Illorian

0

У вас есть несколько вещей в вашем коде:

Первый в машинописном ваш класс должен обеспечить все поля и функции, определенные в интерфейсе. Это может быть иногда утомительным. Если вы хотите этого избежать, и он не сломает вашу структуру, вы можете использовать extends вместо инструментов, а затем вам не нужно переопределять все.

Во-вторых, вы не объявляете объявление конструктора в интерфейсе. Поэтому предложение 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 {};   
} 

Во всяком случае, я предлагаю вам прочитать документацию машинописи первых, чтобы понять эти понятия

+0

Дело в том, как объявить конструктор в интерфейсе? – Illorian

+0

Это не имеет большого смысла и является глобальной проблемой в ООП. Google это, и вы найдете много решений независимо от языка – iberbeu

+0

, но мне нужно объявить в интерфейсе. Это моя проблема – Illorian