TypeScript中的私有“函数”

时间:2013-06-04 13:41:24

标签: typescript

是否可以在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函数在编译时公开?

3 个答案:

答案 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
  }
}