0

如果标题混淆,我很抱歉,我不完全确定如何更好地表达它。类型:JS模块导出类的实例的类型声明,类别的原型

我试图环绕的写作类型声明我的头通过试图产生一个this file(这是this npm module源),其中我基本上出口Eventer类允许模块的实例为单还包含引用类来创建沙盒实例的属性。我正在使用Visual Studio代码来检查属性是否正确。该模块看起来是这样的:

// tiny-eventer.js 

function Eventer() { 
    this.on = function (eventName, listener) { ... }; 
    this.trigger = function (eventName, args) { ... }; 
} 

Eventer.prototype.Eventer = Eventer; 

module.exports = new Eventer(); 

在另一个模块,然后我可以通过要求其使用Singleton类eventer实例,但也创造了沙盒实例调用new eventer.Eventer()

// index.js 

var eventer = require('tiny-eventer'); 

var sandboxedEventer = new eventer.Eventer(); 

sandboxedEventer.on('an-event', function (args) { console.log('sandboxed ' + args); }); 

eventer.on('an-event', function (args) { console.log('global ' + args); }); 

eventer.trigger('an-event', 'is called'); 
// Prints to console: "global is called" 

sandboxedEventer.trigger('an-event', 'is called'); 
// Prints to console: "sandboxed is called" 

这基本上意味着这个可怕的代码是有效太:

// sorry.js 

var eventer = require('tiny-eventer'); 
var otherEventer = new (new (new (new eventer.Eventer()).Eventer()).Eventer()).Eventer(); 

至于分型我已经试过如下:

declare module 'tiny-eventer' { 
    ... 

    interface TinyEventItem { listener: (args) => void } 

    class Eventer { 
     // Doesn't seem to work as it should 
     Eventer: Eventer; 

     on(eventName: String, listener: (args) => void): TinyEventItem; 

     trigger(eventName: string, args: any): void; 
    } 

    export = new Eventer; 
} 

以上将与合作单身属性,如eventer.oneventer.trigger,但似乎也允许eventer.Eventer.on,因此new eventer.Eventer()是不允许的。感觉就像我做错了。

我该如何得到关于编写一个类型属性引用自己的类的类型文件?

回答

0

我想出了一些能够产生我要找的结果的东西(至少在vscode的Intellisense中),尽管我不确定这是一个合适的解决方案。

什么解决了这个问题对我来说是以下Eventer: new Eventer;

如果任何人有一个更好的解决,请发布或更新此。

declare module 'tiny-eventer' { 
    ... 

    interface TinyEventItem { listener: (args) => void } 

    class Eventer { 
     on(eventName: String, listener: (args) => void): TinyEventItem; 

     trigger(eventName: string, args: any): void; 

     // This right here seems to do it 
     Eventer: new Eventer; 
    } 

    export = new Eventer; 
}