为什么我无法访问 TypeScript 私有成员,而我不应该这样做?

2022-08-30 05:11:06

我正在研究TypeScript中私有成员的实现,我发现它有点令人困惑。Intellisense不允许访问私有成员,但在纯JavaScript中,它都在那里。这让我认为 TS 没有正确实现私有成员。有什么想法吗?

class Test{
  private member: any = "private member";
}
alert(new Test().member);

答案 1

与类型检查一样,成员的隐私仅在编译器中强制执行。

私有属性作为常规属性实现,不允许类外部的代码访问它。

要使类中的内容真正私有,它不能是类的成员,它将是在创建对象的代码内的函数范围内创建的局部变量。这意味着您无法像类的成员一样访问它,即使用关键字。this


答案 2

JavaScript 确实支持私有变量。

function MyClass() {
    var myPrivateVar = 3;

    this.doSomething = function() {
        return myPrivateVar++;        
    }
}

在TypeScript中,这将这样表示:

class MyClass {

    doSomething: () => number;

    constructor() {
        var myPrivateVar = 3;

        this.doSomething = function () {
            return myPrivateVar++;
        }
    }
}

编辑

只有在绝对需要的情况下,才应谨慎使用此方法。例如,如果您需要临时缓存密码。

使用此模式存在性能成本(与 Javascript 或 Typescript 无关),并且只应在绝对必要时使用。