理解打字稿类中的“公共”/“私人”

时间:2016-08-02 06:19:28

标签: typescript

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

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

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

}

// generated JS code
var Animal = (function () {
function Animal(name) {
    this.name = name;
}
return Animal;
}());

3 个答案:

答案 0 :(得分:6)

  

生成的java脚本代码相同

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

if let path = NSBundle.mainBundle().pathForResource("Property List", ofType: "plist") { dict = NSDictionary(contentsOfFile: path) if let vanuatu = dict.objectForKey("australia") as? [String:AnyObject]{ if let vanuatuArray = vanuatu["vanuatu"] as? [String]{ print(vanuatuArray[1]) } } } 成员只能在课堂内访问,而private可以在外部访问。

更多

这里有不同之处:https://basarat.gitbooks.io/typescript/content/docs/classes.html#access-modifiers

另一个例子

public

将生成与

相同的ES5
let foo = 123;

但是在第一种情况下const foo = 123; 编译正常,但let foo = 123;foo = 456将导致编译时错误。

答案 1 :(得分:3)

您已经发现,公共,私有,受保护的访问修饰符实际上并不影响最终输出的代码。它们 的作用是在编译时进行类型检查。

他们实际上在做什么?

顾名思义,publicprivate修饰符限制了可以访问类成员的内容。它们也是氏族protected中的第三个修饰符。

私有修饰符仅允许在该类中访问该类成员(变量或方法)。

受保护的修饰符允许private修饰符执行的所有操作,还允许扩展该类的其他类使用它。

最后,使用 public 修饰符可以使任何可以访问该类的人都可以访问public class属性。

有关更深入的解释和示例,请查看官方的TypeScript手册explanation

如果所有编译都相同,为什么还要使用修饰符?!

使用修饰符可使编译器确保您的代码未使用不应使用的东西。首先使用类型的原因相同,这使得更难犯本来就不应该犯的错误!另外,如果您的文本编辑器支持TypeScript,则在显示变量和方法的自动完成值时还将使用访问修饰符。

答案 2 :(得分:0)

在ESnext中,私有类 fields 是使用#号前缀定义的:

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

*注意: 无法定义私有的方法,获取器设置器

但是有一个提案https://github.com/tc39/proposal-private-methods