是否可以在TypeScript类中创建私有“函数”(方法)?假设我们有以下Person.ts
TypeScript文件:
class Person {
constructor(public firstName: string, public lastName: string) {
}
public shout(phrase: string) {
alert(phrase);
}
private whisper(phrase: string) {
console.log(phrase);
}
}
编译时将转换为以下内容:
var Person = (function () {
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Person.prototype.shout = function (phrase) {
alert(phrase);
};
Person.prototype.whisper = function (phrase) {
console.log(phrase);
};
return Person;
})();
我期望在闭包内声明whisper
函数,但原型上没有?基本上这会使whisper
函数在编译时公开?
答案 0 :(得分:75)
TypeScript公钥/私钥关键字仅适用于TypeScript检查代码的方式 - 它们对JavaScript输出没有任何影响。
根据the language specification(第9-10页):
私人可见性是一种设计时构造;它是在执行期间执行的 静态类型检查但不暗示任何运行时实施。 ... TypeScript强制在类中实现封装 设计时间(通过限制使用私人成员),但不能 在运行时强制执行封装,因为所有对象属性都是 可在运行时访问。未来版本的JavaScript可能会提供 私有名称,可以启用私有的运行时执行 成员
这已在此处提出并回答:https://stackoverflow.com/a/12713869/1014822
更新:这个旧答案仍会获得大量流量,因此值得注意的是,除了上面的语言规范链接外,还详细介绍了公共,私有和(现在)受保护的成员在关于类的TypeScript handbook章节中。
2018年更新 ES Private Fields的实现现在是TypeScript RoadMap上的Future项目,尽管discussion表明这将是一个并行的硬私有选项,而不是当前软私有实现的替代。
答案 1 :(得分:7)
在Javascript(与TypeScript相对)中,您不能拥有私有的“成员”功能。
如果在闭包中定义私有函数,则无法将其作为类实例上的实例方法调用。
如果这是你想要的,只需将TypeScript函数定义移到类体外。
答案 2 :(得分:0)
您可以在TypeScript / Webpack甚至本机的最新Google Chrome版本中使用私有类变量和函数。只需在名称前添加#
。参见here。
MyClass{
#privateMember: Number = 4
#privateMethod() {
this.#privateMember = 3
}
}