我最大的一个关于TypeScript的问题是,它将原型的所有方法(无论访问修饰符)编译.
例
class Example {
public getString(): string {
return "Hello World";
}
private getNumber(): number {
return 123;
}
}
众所周知,访问修饰符仅在编译时检查,因此被发出的JavaScript忽略. JavaScript开发人员学会减轻这种情况的一种方法是使用闭包(好吧,我们知道使用闭包会有性能损失,但我相信有些情况下绝对需要关闭).
例
var Example = (function () {
function Example() {
this.getString = function () {
return "Hello World";
}
var getNumber = function() {
return 123;
}
}
return Example;
})();
以上示例尊重公共/私人访问.
我已经解决了使用lambda语法我们可以在TypeScript中声明公共闭包方法.
例
class Example {
getString = (): string => {
return "Hello World";
}
}
它不是特别漂亮,但它有效.
我想知道的是:我如何在TypeScript中声明私有闭包?
例
class Example {
// TypeScript doesn't like this!
var getNumber = (): number => {
return 123;
}
}
在这里查看有关此bugbear的更多信息:https://github.com/Microsoft/TypeScript/issues/2940
解决方法:
TypeScript为ES6带来了类型和访问器(它会静态检查). TypeScript中的class关键字是ES6中的标准类关键字. ES6课程中没有私人关闭.此语法在ES6中无效:
class Example {
var v = /* ... */; // invalid in ES6
}
如果需要声明封装变量的闭包,则应使用经典的JavaScript方法.我强烈建议利用TS接口:
interface NamedObject {
getName(): string;
}
let createNamedObject = function (name = 'John'): NamedObject {
return {
getName: function () {
return name;
}
};
};
let obj: NamedObject = createNamedObject();
如果你真的想用闭包创建类方法,你可以这样做:
class BadPerformance {
public getName: () => string;
constructor(name = 'John') {
this.getName = () => {
return name;
};
}
}