从Typescript中的函数中导出类

时间:2016-06-04 22:16:13

标签: class typescript

这就是我想要实现的目标:

loadDependency(function(dep){   
    //error, can't use export within a function
    export class MyClass {
        myF(){
            dep.myStuff();
        }
    } 
});

我只能从有权访问dep的范围创建类。

函数loadDependency只会被调用一次。我想继续使用内部模块。

有没有办法欺骗编译器实现这一目标?

我的目标是在其他文件中自动完成。例如:var a:MyClass

2 个答案:

答案 0 :(得分:0)

您可能可以在模块/命名空间级别“创建”类,并在获得此dep的实例时实例化它的对象,因此这将是:

export class MyClass {}

loadDependency(function(dep) {
    let myInstance = new MyClass();
    // do something with myInstance, MyClass and dep
});

然后您还可以从其他文件访问MyClass

您的示例中不能export的原因是export仅在模块/命名空间的上下文中工作,它是一个静态声明,告诉编译器该类应该可以从在模块/名称空间旁边。

例如,这个:

export class MyClass {}

编译成:

define(["require", "exports"], function (require, exports) {
    "use strict";
    var MyClass = (function () {
        function MyClass() {
        }
        return MyClass;
    }());
    exports.MyClass = MyClass;
});

而且:

module moo {
    export class MyClass {}
}

分为:

var moo;
(function (moo) {
    var MyClass = (function () {
        function MyClass() {
        }
        return MyClass;
    }());
    moo.MyClass = MyClass;
})(moo || (moo = {}));

(在目标ES5和默认模块系统下,CommonJS)。

您尝试做的是从功能范围内导出一个类,这是没有意义的 如果永远不会执行此功能怎么办?

修改

如果您需要班级中的dep,请将其作为参数传递给ctor:

export class MyClass {
    private dep: any;

    constructor(dep: any) {
        this.dep = dep;
    }

    myF() {
        this.dep.myStuff();
    }
}

loadDependency(function(dep) {
    let myInstance = new MyClass(dep);
});

如果你有:

module MyModule {
    export class MyClass() { };
}

然后您可以使用:MyModule.MyClass访问该课程,但如果您有:

module MyModule {
    export function myFunction() {
        export class MyClass() { };
    }
}

那你怎么去上课?它不是MyModule.myFunction.MyClass,因为只有在myFunction执行时才有效。在你的例子中也一样。

答案 1 :(得分:0)

欺骗编译器。

var MyFunc = function(dep){ 
    if(!dep)
        return null;
    class MyClass {
        myFunc(){}
    }
    class MyClass2 {
        myFunc2(){}
    }
    return true ? null : {MyClass:new MyClass(),MyClass2:new MyClass2()};
}   

export var MyClasses = MyFunc(null);
loadDependency(myFunc);


var test:typeof MyClasses.MyClass = null; //has autocompletion