这就是我想要实现的目标:
loadDependency(function(dep){
//error, can't use export within a function
export class MyClass {
myF(){
dep.myStuff();
}
}
});
我只能从有权访问dep
的范围创建类。
函数loadDependency
只会被调用一次。我想继续使用内部模块。
有没有办法欺骗编译器实现这一目标?
我的目标是在其他文件中自动完成。例如:var a:MyClass
。
答案 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