javascript - 使用类原型(prototype)键入 : Type declaration for JS module exporting instance of class,

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

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

我正在尝试为 this file 生成一个类型声明,从而集中精力编写类型声明。 (这是 this npm module 的来源),其中我基本上导出 Eventer 的实例类允许模块作为单例,但还包含引用该类的属性来创建沙盒实例。我正在使用 Visual Studio Code 检查属性是否正确。该模块看起来像这样:

// 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.oneventer.trigger ,但似乎也允许 eventer.Eventer.on ,其中new eventer.Eventer()是不允许的。感觉我做错了。

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

最佳答案

我找到了一些可以产生我正在寻找的结果的方法(至少在 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;
}

关于javascript - 使用类原型(prototype)键入 : Type declaration for JS module exporting instance of class,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747037/

相关文章:

utf-8 - VS Code 无法读取其他编辑器编写的 unicode 语言

git - 如何使用 VS Code 将新项目添加到 Github

javascript - $.getJSON 无法识别 JSON

javascript - 单击带有 jquery 的文本链接

visual-studio-code - 无法从 VS Code 将 Altair 图表另存为 SVG

javascript - 导出并在另一个js文件中重用一个js文件的重载函数

javascript - 如何将 dockerfile 环境变量传递给node.js 文件?

javascript - JQuery 同步 2 复选框

javascript - 无法在 ASP.NET cs 页面中调用 javascript 函数

javascript - jQuery DataTables 按 n 列复选框排序