为什么我不能在 TypeScript 类中声明局部变量和函数?



在TypeScript中,如果编译器不将函数添加到原型中,我似乎无法在类中声明函数。例如:

class MyTypeScriptClass {
// method, is added to prototype
foo1(): void {
alert('invoked foo1');
}
// private method also added to prototype
private foo2(): void {
alert('invoked foo2');
}
//// can I have a local function, without making it a private method?
//function foo3() {
//    alert('invoked foo3');
//}
}

以上编译为:

var MyTypeScriptClass = (function () {
function MyTypeScriptClass() { }
MyTypeScriptClass.prototype.foo1 = function () {
alert('invoked foo1');
};
MyTypeScriptClass.prototype.foo2 = function () {
alert('invoked foo2');
};
return MyTypeScriptClass;
})();

我正在寻找的是可以编译为以下JavaScript的typescript:

var fvm = new FlasherViewModel2();
var MyTypeScriptClass = (function () {
function MyTypeScriptClass() { }
MyTypeScriptClass.prototype.foo1 = function () {
alert('invoked foo1');
};
MyTypeScriptClass.prototype.foo2 = function () {
alert('invoked foo2');
};
function foo3() {
alert('invoked foo3');
}
return MyTypeScriptClass;
})();

能做到吗

(顺便说一句,我知道foo3不可从外部代码调用。我实际上会从类中的另一个方法调用foo3,例如,将函数传递给jQuery fadeOut。)

正如apsillers提到的,private static可能就是您想要的。虽然它在当前版本中不受支持,但在未来的某个时候,您将能够在TypeScript中拥有private static成员(设计团队根据类似的反馈改变了主意)。

我刚刚发现了在typescript类中使用私有方法的另一种方法,尽管这种模式可能闻起来有点好笑。据我所知,只有当您将类包装在module中时,才能做到这一点。例如:

module MyApp {
// not accessible externally, `this` must be passed in if needed
function foo3(that: MyTypeScriptClass): void {
that.foo1();
alert('invoked foo3');
}
// not accessible externally
function foo4(): void {
alert('invoked foo4');
}
export class MyTypeScriptClass {
// normal method, is added to prototype
foo1(): void {
alert('invoked foo1');
}
// private method also added to prototype, is accessible externally
private foo2(): void {
alert('invoked foo2');
foo3(this);
foo4();
}
}
}

以上编译为:

var MyApp;
(function (MyApp) {
function foo3(that) {
that.foo1();
alert('invoked foo3');
}
function foo4() {
alert('invoked foo4');
}
var MyTypeScriptClass = (function () {
function MyTypeScriptClass() { }
MyTypeScriptClass.prototype.foo1 = function () {
alert('invoked foo1');
};
MyTypeScriptClass.prototype.foo2 = function () {
alert('invoked foo2');
foo3(this);
foo4();
};
return MyTypeScriptClass;
})();
MyApp.MyTypeScriptClass = MyTypeScriptClass;    
})(MyApp || (MyApp = {}));

如上所述,外部javascript可以在MyTypeScriptClass的实例上调用foo2(),但在运行时,foo3()foo4()都不能从外部访问。最大的警告是,如果您的私有方法需要访问实例的成员,则必须将this作为函数参数传入。本质上,这些都是私有静态方法。

var instance = new MyApp.MyTypeScriptClass();
// public, accessible externally
instance.foo1();
// will not compile in a .ts file, but works at runtime from manual js file
instance.foo2();
// runtime exception, foo3 is not defined
foo3(instance);
MyApp.foo3(instance);
// runtime exception, foo4 is not defined
foo4();
MyApp.foo4();

这种方法也适用于标量变量,但这些变量本质上也是静态的——不同的类实例不能有不同的值。要做到这一点,据我所知,您仍然需要在类中声明它们。将它们标记为private将阻止typescript编译器允许对它们进行外部调用,但其他javascript代码仍然可以从外部访问它们。

最新更新