“理解”;公开的&引用;“私人”;在typescript类中

“理解”;公开的&引用;“私人”;在typescript类中,typescript,Typescript,在下面的类型脚本代码中,无论名称是“public”还是“public” “private”,生成的java脚本代码是相同的 所以我的问题是,如何决定何时应该使用构造函数参数 公共还是私人 // typescript code class Animal { constructor( public name: string) { } } // generated JS code var Animal = (function () { function Animal(name) {

在下面的类型脚本代码中,无论名称是“public”还是“public” “private”,生成的java脚本代码是相同的

所以我的问题是,如何决定何时应该使用构造函数参数 公共还是私人

// typescript code
class Animal {  
constructor( public name: string) {     
}

}

// generated JS code
var Animal = (function () {
function Animal(name) {
    this.name = name;
}
return Animal;
}());
生成的java脚本代码是相同的

它们生成相同的JavaScript,但就类型而言,它们的语义不同

private
成员只能从类内部访问,而
public
成员只能从外部访问

更多 此处介绍了这些差异:

另一个例子 将生成与相同的ES5

const foo = 123; 

然而,在第一种情况下,让foo=123;foo=456可以很好地编译,但是
const foo=123;foo=456
将导致编译时错误

正如您所发现的,公共、私有、受保护的访问修饰符实际上并不影响最终输出的代码。它们影响的是编译时的类型检查

他们实际上做什么? 顾名思义,
public
private
修饰符限制了可以访问类成员的内容。他们也是氏族中的第三个修饰语,
受保护

private修饰符只允许在该类中访问类成员(变量或方法)

protected修饰符允许
private
修饰符所做的一切,也允许扩展该类的其他类使用它

最后,public修饰符使任何可以访问该类的东西都可以访问public类属性

要获得更深入的解释和示例,请参阅官方打字本手册

如果所有的编译都一样,为什么我要使用修饰符?!
使用修饰符将使编译器能够确保您的代码没有使用不应该使用的东西。这与最初使用类型的原因是一样的,它使得犯本来不应该犯的错误变得更加困难!另外,如果您的文本编辑器支持TypeScript,它还将在显示变量和方法的自动完成值时使用访问修饰符。

在ESnext中,私有类字段使用哈希前缀定义:

*注: 无法定义私有方法、gettersetter


但是有一个提议

JavaScript没有任何私有/公共的概念。但TypeScript确实如此。因此,如果您将名称设置为私有,那么TypeScript编译器将不允许其余的TypeScript代码访问该字段,而如果它是公共的,则会访问该字段。对于那些使用TypeScript实现Angular的人来说,值得一提的是,public或private将使用数据绑定和指令。然而,当变量为私有变量时,某些IDE(如VS代码)会显示错误。
const foo = 123; 
class MyClass {
  a = 1;          // .a is public
  #b = 2;         // .#b is private
  static #c = 3;  // .#c is private and static
  incB() {
    this.#b++;
  }
}

const m = new MyClass();
m.incB(); // runs OK
m.#b = 0; // error - private property cannot be modified outside class