Почему TypeScript жалуется на наследование родительского класса?

#javascript #typescript

#javascript #typescript

Вопрос:

Итак, у меня есть эта кодовая база:

 var MicroEvent  = function(){}
MicroEvent.prototype    = {
    bind    : function(event, fct){
        this._events = this._events || {};
        this._events[event] = this._events[event]   || [];
        this._events[event].push(fct);
    },
    unbind  : function(event, fct){
        this._events = this._events || {};
        if( event in this._events === false  )  return;
        this._events[event].splice(this._events[event].indexOf(fct), 1);
    },
    trigger : function(event /* , args... */){
        this._events = this._events || {};
        if( event in this._events === false  )  return;
        for(var i = 0; i < this._events[event].length; i  ){
            this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1))
        }
    }
};

class PluginManager extends MicroEvent {
     registerPlugin(pluginName: string, applicationName: string, active: boolean = true) {
          // code
     }
     // ...code
}
  

Используя этот код, я продолжаю получать эту ошибку:
изображение ошибки

Я пытался добавить файл .d.ts следующим образом:

 declare interface MicroEvent {
    registerPlugin(arg1: string, arg2: string, arg3?: boolean): void;
    bind(event: string, fct: string):void
    unbind(event: string, fct: string):void
    trigger(event: string):void
}
  

Но это не исправляет ошибку.

Что вызывает эту ошибку?

Заранее спасибо!

Комментарии:

1. Вы должны declare class MicroEvent вместо declare interface MicroEvent . Что еще вам нужно будет сделать declare const MicroEvent: () => MicroEvent .

2. @jcalz хорошо, я изменил свой .d.ts, но проблема сохраняется. Оба файла .ts и .d.ts. file находятся в одном каталоге. Я не должен импортировать .d.ts. файл в .ts, не так ли?

3. Используя опубликованный вами код, вы получаете Type '() => void' is not a constructor function type.

4. Вы должны либо поместить существующий MicroEvent код в отдельное место (похоже, это чистый JS, а не TS, так что это должно быть возможно сделать) и ссылаться на его типы с помощью declare приведенного выше кода, либо вам нужно правильно аннотировать MicroEvent код. Последнее — это то, что вам советует делать ответ @mbojko.

5. @jcalz на самом деле MicroEvent код события существует в node_modules папке, поэтому он находится в отдельном файле. Итак, каким будет конечный код? По-прежнему не работает : (Прямо сейчас я использую declare class то, что вы предложили, и MicroEvent в отдельном файле.

Ответ №1:

Смешивание соглашений (прототип и класс) похоже на напрашивание на неприятности (и, вероятно, источник путаницы для TypeScript). Просто придерживайтесь одного шаблона:

 class MicroEvent {
    bind //...
    unbind  //...
    trigger //...
};

class PluginManager extends MicroEvent { //...
  

Комментарии:

1. Да, я знаю, спасибо, но сейчас нет возможности это сделать

2. @NikitaShchypyplov Почему нет?

3. Это в node_modules.

4. Ofc я могу разместить в своей собственной кодовой базе, но я думаю, что это не так, как это должно работать, не так ли?