类型:JS模块的类型声明导出类的实例,具有类的原型

时间:2016-09-28 12:08:10

标签: javascript node.js visual-studio-code typescript-typings

如果标题令人困惑,我很抱歉,我不完全确定如何更好地表达它。

我试图通过尝试为this filethis npm module的源代码)生成一个来编写类型声明,其中我基本上导出{{1的实例允许模块作为单例的类,但也包含引用该类以创建沙盒实例的属性。我正在使用Visual Studio Code来检查属性是否正确。该模块看起来像这样:

Eventer

在另一个模块中,我可以通过要求它来使用类似单身的// tiny-eventer.js function Eventer () { this.on = function (eventName, listener) { ... }; this.trigger = function (eventName, args) { ... }; } Eventer.prototype.Eventer = Eventer; module.exports = new Eventer(); 实例,但也可以创建一个调用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.on等单身属性,但似乎也允许使用eventer.trigger,因此不允许使用eventer.Eventer.on。感觉我做错了。

我如何编写一个类型文件来声明一个具有引用自身属性的类?

1 个答案:

答案 0 :(得分:0)

我找到了能够产生我想要的结果的东西(至少在vscode'智能感知中),虽然我不确定它是否是一个合适的解决方案。

为我解决的是以下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;
}