我可以从TypeScript中以转译的ES5代码访问私有成员

时间:2019-06-27 05:21:23

标签: typescript

我在TypeScript's Playground page上学习TypeScript
我不确定TypeScript是否能很好地编译代码。
我创建了一个class,并且该课程有一个name作为私有成员
因此,我做了一些测试,是否可以访问已编译代码中的类的私有成员。
但是,我成功访问了私人成员。
我只是在学习TypeScript。所以我认为我可能选择了错误的选项。

选定的选项

(已添加)TypeScript版本:3.5.1
目标:ES5
JSX:None
选中的选项是:

  • noImplicitAny
  • stricNullChecks
  • strictFunctionTypes
  • stricPropertyInitialization
  • noImplicitThis
  • noImplicitReturns
  • alwaysStrict

我的TypeScript代码

class Person {
    private _name: string;
    _age: number;

    constructor(name: string, age: number) {
        this._name = name;
        this._age = age;
    }

    setName(name: string) {
        this._name = name;
    }

    getName(): string {
        return this._name;
    }

    setAge(age: number) {
        this._age = age;
    }

    getAge(): number {
        return this._age;
    }
}

const person = new Person('James', 23);
console.log(person.getName()); // James
console.log(person._name);  // error: Property '_name' is private and only accessible within class 'Person'.
console.log(person._age); // 23

已将代码转换为ES 5

"use strict";
var Person = /** @class */ (function () {
    function Person(name, age) {
        this._name = name;
        this._age = age;
    }
    Person.prototype.setName = function (name) {
        this._name = name;
    };
    Person.prototype.getName = function () {
        return this._name;
    };
    Person.prototype.setAge = function (age) {
        this._age = age;
    };
    Person.prototype.getAge = function () {
        return this._age;
    };
    return Person;
}());
var person = new Person('James', 23);
console.log(person.getName());  // James
console.log(person._name); // James
console.log(person._age); // 23



有什么建议吗?

1 个答案:

答案 0 :(得分:3)

目前,JavaScript没有真正的私有成员。 TypeScript中private的概念仅用于帮助您防止编码错误。将来,ECMAScript可能会引入真正的私有成员,但是在此之前,您仍然可以在编译后访问“私有成员”。