如果标题令人困惑,我很抱歉,我不完全确定如何更好地表达它。
我正在尝试为 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.on
和eventer.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/