我们可以在打字稿中访问另一个类中的私有变量吗

Posted

技术标签:

【中文标题】我们可以在打字稿中访问另一个类中的私有变量吗【英文标题】:Can we access a private variable in another class in typescript 【发布时间】:2016-06-08 04:10:48 【问题描述】:
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();

您好,我是动物类中这个 TypeScript 的新手,我创建了一个私有变量名,我在类构造函数中使用了它。现在在Tiger 类中,我为Animal 类创建了实例,并且能够访问该私有变量。

我的问题是在 Java 中,如果我们这样做,我们会得到错误。但是在 TypeScript 中(因为 TypeScript 支持 OOPS)我们没有收到任何错误而且它给出的值怎么可能?

【问题讨论】:

@JamesWilkins 说的是readonly 而不是private 好的,感谢@Timmmm。 ;) 【参考方案1】:

首先 - 您的代码将无法编译。 TypeScript 将检查名称的可访问性并给您一个错误。在打字稿游乐场检查自己:playground

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

console.log((<any>animalName).name)

这是因为原生 javascript 没有私有属性的概念。而且由于 TypeScript 被编译成 JavaScript,你就有这样的可能性。

【讨论】:

+1 好答案。想提一下,依靠private 在运行时不是私有的事实会使代码迁移在某些时候变得更加困难+ 大大降低了可维护性。 OP 应该重新考虑他们的设计。【参考方案2】:

使用 Amid 发布的 as any 技巧的替代方法是使用字符串索引表示法,这是用于访问私有成员的 intentional escape hatch:

console.log(animalName['name']);

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

【讨论】:

如果你使用 eslint 的 dot-notation 规则,你可能会收到警告。考虑采用让所有私有成员以下划线开头的约定;这样,你可以更新你的 eslint 配置,让 'dot-notation': ['error', allowPattern: '^_'], 忽略这些字段。【参考方案3】:

不能直接从其他类访问私有变量,但可以通过getter和setter方法实现。

【讨论】:

以上是关于我们可以在打字稿中访问另一个类中的私有变量吗的主要内容,如果未能解决你的问题,请参考以下文章

如何理解打字稿中的“属性'名称'在'用户'类型中是私有的”

用玩笑测试打字稿中的私有函数

如何在c#中访问另一个类中的一个类的私有函数?

从子类访问父类的私有实例变量?

父类中的私有变量

通过函数访问另一个类中的私有结构 LinkedList;