我们可以在typescript中访问另一个类中的私有变量

KPR*_*nya 8 typescript

class Animal {
    private name:string;
    public Firstname:string;
    constructor(theName: string)
    {
        this.name = theName;
        this.Firstname=theName;
    }
}

class Tiger {
    function sample(){
        Animal animalName=new Animal('Tiger');
        document.body.innerHTML = animalName.name;
    }
    sample();
}
Run Code Online (Sandbox Code Playgroud)

你是动物类中这个typeScript的新手我已经创建了一个私有变量名,我在类构造函数中使用它.在类Tiger中我创建了Animal类的实例,并且能够访问该私有变量.

我的问题是在java中,如果我们这样做,我们将得到错误.但是在typeScript中(因为typescript支持oops)我们没有得到任何错误而且它给出了值如何可能?

Ami*_*mid 23

首先 - 你的代码不会编译.Typescript将检查名称的可访问性并给出错误.在打字稿操场上检查自己:操场

第二 - 如果要删除打字稿检查,则可以访问私有属性,例如:

console.log((<any>animalName).name)
Run Code Online (Sandbox Code Playgroud)

这是因为本机javascript没有私有属性(私有属性)的概念.由于打字稿被编译为javascript,你有这样的可能性.


Ole*_*ich 10

使用as anyAmid 发布的技巧的另一种方法是使用字符串索引表示法,这是一种用于访问私有成员的有意逃生舱口

console.log(animalName['name']);
Run Code Online (Sandbox Code Playgroud)

这具有类型安全的优点,因此如果您删除name,您将在此处收到编译器错误。

  • 如果您使用 eslint 的“点表示法”规则,您可能会收到警告。考虑采用让所有私有成员以下划线开头的约定;这样,您可以更新 eslint 配置以使用 `'dot-notation': ['error', {allowPattern: '^_'}],` 来忽略此类字段。 (2认同)