打字稿内部如何处理封装,继承和数据隐藏?

时间:2018-01-02 19:58:56

标签: javascript typescript2.0 transpiler

我很想探索和理解es5转化过程的打字稿。关于typescript如何使用闭包来创建作用域和管理继承这一部分我很清楚,在编译ES5中如何准确地实现私有数据成员和封装这一事实仍然令我感到惊讶,我没有看到任何区别私人和公共数据成员范围。打字稿究竟如何在内部处理隐私? 它究竟是为原型继承做什么的(var __extends)?

以下是打字稿操场的链接,我正在尝试: https://www.typescriptlang.org/play/#src=class%20Shape%7B%0D%0A%20%20%20%20private%20name%3A%20string%3B%0D%0A%20%20%20%20public%20shapeType%3A%20string%3B%0D%0A%0D%0A%20%20%20%20constructor(name%20%2C%20shapeType)%20%7B%0D%0A%20%20%20%20%20%20%20%20this.name%20%3D%20name%3B%0D%0A%20%20%20%20%20%20%20%20this.shapeType%20%3D%20shapeType%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20%0D%0A%7D%0D%0A%0D%0Aclass%20Triangle%20extends%20Shape%7B%0D%0A%20%20%20%20constructor(name%2C%20shapeType)%20%7B%0D%0A%20%20%20%20%20%20%20%20super(name%20%2C%20shapeType)%3B%0D%0A%20%20%20%20%7D%0D%0A%7D

打字稿:

makeJSON

透明的JS:

class Shape{
    private name: string;
    public shapeType: string;

    constructor(name , shapeType) {
        this.name = name;
        this.shapeType = shapeType;
    }

}

class Triangle extends Shape{
    constructor(name, shapeType) {
        super(name , shapeType);
    }
}

1 个答案:

答案 0 :(得分:0)

成员的隐私只在打字稿本身内强制执行。所以他们只是在打字稿中是“私人的”才是为了方便。在typescript中,编译器只检查该属性是否为私有属性,但一旦转换为私有属性就是一个普通的属性。

如果您有兴趣在JS中创建私有内容,可以参考Emulating private methods with closures