TS类编译之后就会变成普通的JS类,private和protected在编译之后都会变成和public一样
访问控制只会在编译时检查
所以扩展一个类时,不能和这个类的任何private成员重名
class A {
private test = 2;
}
class B extends A {
private test = 1;
}
class C extends A {
protected test = 1;
}
class D extends A {
public test = 1;
}
编译器报错
Class ‘B’ incorrectly extends base class ‘A’.
Types have separate declarations of a private property ‘test’.Class ‘C’ incorrectly extends base class ‘A’.
Property ‘test’ is private in type ‘A’ but not in type ‘C’.Class ‘D’ incorrectly extends base class ‘A’.
Property ‘test’ is private in type ‘A’ but not in type ‘C’.
那么应该如何解决,很遗憾,在ES6之前是没办法的
如果TS要编译成ES6+
可以这样
class A {
#test = 2;
}
class B extends A {
#test = 1;
}
class C extends A {
public test = 1;
}
#
是ES6+的private
在JS里派生类的私有成员可以和基类重名,到了TS里当然也就可以
这里要注意了
#
本身也是成员名的一部分,所以这样会是两个不同的成员
class Test {
#test = 1
test = 2
}