Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中将React/Flux调度器作为单例_Javascript_Reactjs_Typescript_Flux - Fatal编程技术网

Javascript 在Typescript中将React/Flux调度器作为单例

Javascript 在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

我正在重建in-TypeScript(使用来自tsd的React、Flux和Node绑定),但在实现dispatcher时遇到了一个问题,dispatcher本质上是一个单例。

我正在尝试以下方法:

AppDispatcher.ts

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();
  • 我是否在TypeScript中实现了单例错误
  • 一般来说,有没有更好的方法?我考虑过不编写一个类,只导出某些函数(如其他SO问题中建议的)就可以编写一个类,但是我仍然想扩展Flux.Dispatcher类

  • 正如评论员所建议的,您需要将使用类的代码移动到该类声明之下。类只是变量,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()是否有帮助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(...);