代码之家  ›  专栏  ›  技术社区  ›  Mizlul

在typescript中封装是如何工作的

  •  0
  • Mizlul  · 技术社区  · 7 年前

    我试图理解封装是如何在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上工作的?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Sergeon    7 年前

    问题是,typescript只是 编译 但它没有运行时。

    typescript在 编译类型 . 它告诉你:

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

    然而,一旦TS编译并生成JS代码,所有的typescript注释都将在代码中丢失。javascript不知道 private , enum interfaces . 一旦您的代码被编译,然后在浏览器或任何其他JS运行时中运行,您将有一个 封装 javascript对象 有两个字段, str1 战略2 . 他们不能 私有的 public 因为JS不知道。 封装 将是一个简单的纯JavaScript对象。

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

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

        2
  •  1
  •   Doğancan Arabacı    7 年前

    这是因为typescript只是一种静态类型检查语言。 编译到JS后,您正在执行的操作是有效的,因此没有运行时错误。

        3
  •  1
  •   Mathyn    7 年前

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

    但是,您的代码仍将运行,因为即使typescript生成了语法错误,它也很可能仍然输出有效的javascript代码。