Javascript 在Typescript中将React/Flux调度器作为单例
我正在重建in-TypeScript(使用来自tsd的React、Flux和Node绑定),但在实现dispatcher时遇到了一个问题,dispatcher本质上是一个单例。 我正在尝试以下方法: AppDispatcher.tsJavascript 在Typescript中将React/Flux调度器作为单例,javascript,reactjs,typescript,flux,Javascript,Reactjs,Typescript,Flux,我正在重建in-TypeScript(使用来自tsd的React、Flux和Node绑定),但在实现dispatcher时遇到了一个问题,dispatcher本质上是一个单例。 我正在尝试以下方法: AppDispatcher.ts export var instance = AppDispatcher.getInstance(); class AppDispatcher extends Flux.Dispatcher<AppPayload> { private stati
export var instance = AppDispatcher.getInstance();
class AppDispatcher extends Flux.Dispatcher<AppPayload> {
private static _instance:AppDispatcher = new AppDispatcher();
constructor() {
super()
if(AppDispatcher._instance){
throw new Error("Error: Using this constructor should not be possible...WTH javascript");
}
AppDispatcher._instance = this;
}
public static getInstance():AppDispatcher
{
return AppDispatcher._instance;
}
...
}
不幸的是,我得到了一个运行时异常未捕获的TypeError:无法读取指向传输Javascript行的未定义的属性“getInstance”
exports.instance = AppDispatcher.getInstance();
正如评论员所建议的,您需要将使用类的代码移动到该类声明之下。类只是变量,JavaScript中的变量按顺序初始化 通常,您不需要在TypeScript中使用显式类单例模式。看 无用单态模式 命名空间等价
以下是我如何在React/Flux项目中使用模块的单例:
class AppDispatcher extends Flux.Dispatcher {
// ...
}
export default new AppDispatcher();
可以将单例导入另一个文件,如:
import AppDispatcher from "./AppDispatcher";
AppDispatcher.dispatch(...);
如果需要导出类类型,可以将export
添加到class AppDispatcher
中,如果需要在同一个文件中同时导入这两个类,则可以使用不同的名称导入singleton(我倾向于在单元测试中需要此名称):
导入AppDispatcherInstance,{AppDispatcher}从“/AppDispatcher”
移动export var instance=AppDispatcher.getInstance()是否有帮助下面是你们的班级吗?谢谢你们,你们说得对@ryan cavanaugh一个一般性问题:假设我使用node.d.ts的EventEmitter。我会将它的单个实例构造为.ts中的非导出变量。然后我实现emitChange()之类的函数,它们使用这个实例,我只导出这些实例。走这条路对吗?
namespace Singleton {
export function someMethod() { ... }
}
// Usage
Singleton.someMethod();
var x = Singleton; // If you need to alias it for some reason
class AppDispatcher extends Flux.Dispatcher {
// ...
}
export default new AppDispatcher();
import AppDispatcher from "./AppDispatcher";
AppDispatcher.dispatch(...);