如果标题令人困惑,我很抱歉,我不完全确定如何更好地表达它。
我试图通过尝试为this file(this 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
。感觉我做错了。
我如何编写一个类型文件来声明一个具有引用自身属性的类?
答案 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;
}