#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 я могу разместить в своей собственной кодовой базе, но я думаю, что это не так, как это должно работать, не так ли?