TypeScript中的私有"函数"

Ric*_*ard 71 typescript

是否可以在TypeScript类中创建私有"函数"(方法)?假设我们有以下Person.tsTypeScript文件:

class Person {
    constructor(public firstName: string, public lastName: string) {
    }

    public shout(phrase: string) {
        alert(phrase);
    }

    private whisper(phrase: string) {
        console.log(phrase);
    }
}
Run Code Online (Sandbox Code Playgroud)

在编译时将其转换为以下内容:

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;
})();
Run Code Online (Sandbox Code Playgroud)

意见

我期待whisper函数在闭包内声明,但不是在原型上?从本质上讲,这会使whisper函数在编译时公开?

Jud*_*her 83

TypeScript公钥/私钥关键字仅适用于TypeScript检查代码的方式 - 它们对JavaScript输出没有任何影响.

根据语言规范(第9-10页):

私人可见性是一种设计时构造; 它在静态类型检查期间强制执行,但并不意味着任何运行时实施.... TypeScript在设计时强制在类中实现封装(通过限制私有成员的使用),但不能在运行时强制执行封装,因为所有对象属性都可以在运行时访问.未来版本的JavaScript可能会提供私有名称,这些名称将启用私有成员的运行时实施

这已经在这里被问及并回答:https://stackoverflow.com/a/12713869/1014822

更新:这个古老的答案仍然得到的业务量,所以值得一提的是,除了上述语言规范链接,公共,私人和(现在的)保护的成员涵盖了打字稿详细手册上的班章.

2018更新 ES私有字段的实现现在是TypeScript RoadMap的未来项目,尽管讨论表明这将是一个并行的硬私有选项,而不是当前软私有实现的替代.


SLa*_*aks 9

在Javascript(而不是TypeScript)中,您不能拥有私有的"成员"功能.

如果在闭包中定义私有函数,则无法将其作为类的实例上的实例方法调用.

如果这是你想要的,只需将TypeScript函数定义移到类体外.

  • @Richard:不; `var self = this`与此无关.关键是没有办法让`instance.method()`只在你的闭包中起作用. (2认同)