【问题标题】:How encapsulation works in TypeScript封装在 TypeScript 中的工作原理
【发布时间】:2018-12-12 12:16:35
【问题描述】:

我试图了解封装在 Typescript 中的工作原理,并提出了一个让我感到困惑的示例,为什么我能够访问甚至直接更改某个类的私有成员。

class Encapsulate {
    str:string = "hello"
    private str2:string = "world"
}

var obj = new Encapsulate();
console.log(obj.str);     //accessible
obj.str2 = "something else";
console.log(obj.str2);   //compilation Error as str2 is private

输出:你好,其他的

我收到编译时警告,例如编译错误,因为 str2 是私有的,但我仍然可以更改或访问它。我是否总体上缺少封装的概念,它是什么以及它在 Typescript 上的工作方式。

【问题讨论】:

标签: javascript typescript oop


【解决方案1】:

问题是 typeScript 只是编译成 javaScript,但它没有运行时。

TypeScript 在编译类型处给你这些警告。它告诉你:

嘿,Encapsulate str2 是私有的,你仍在尝试访问它。你不应该那样做。

但是一旦 ts 编译生成了 js 代码,所有的 typescript 注解都在代码中丢失了。 JavaScript 对privateenuminterfaces 一无所知。一旦您的代码被编译并在浏览器或任何其他 js 运行时中运行,您将拥有一个 Encapsulate javaScript 对象,其中包含两个字段,str1str2。它们不能是privatepublic,因为 js 不知道这一点。 Encapsulate 将是一个纯 JavaScript 对象。

因此,基本上,typeScript 可以帮助您在编译时捕获错误。但是,一旦代码编译,它将“忘记”关于 typeScript 注释的所有内容。

它可以告诉你不应该访问str2。如果发现这样的错误,它甚至可以拒绝编译(这取决于 tsconfig 配置)。但是编译后的代码与打字稿没有任何关系。

【讨论】:

    【解决方案2】:

    这是意料之中的,因为 TypeScript 只是一种静态类型检查语言。 一旦编译成js,你正在执行的操作是有效的,因此没有运行时错误

    【讨论】:

      【解决方案3】:

      Javascript 没有类的私有成员和公共成员的概念 (though this might change in the future)。此时,仅在编译时检查将类中的属性或函数标记为私有(这就是您收到语法错误的原因)。

      您的代码仍然会运行,因为即使 Typescript 生成了语法错误,它也很可能仍然输出有效的 Javascript 代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 2012-09-02
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多