在TypeScript Handbook中,它说:
类中的私有成员和受保护成员会影响其兼容性。 检查类的实例是否兼容时,如果是 instance包含一个私有成员,那么目标类型也必须 包含源自同一个类的私有成员。 同样,这同样适用于具有受保护成员的实例。 这允许类与其超类兼容, 但不是来自不同继承层次结构的类 否则具有相同的形状。
虽然TypeScript中的类型兼容性是结构性的(鸭子类型):
class Animal {
feet: number;
}
class Size {
feet: number;
}
let a: Animal = new Size; // Ok!
包含受保护/私有成员的类的案例实际上是名义上的:
class Animal {
private feet: number;
}
class Size {
private feet: number;
}
let a: Animal = new Size; // Error!
有人可以解释为什么在公共受众和受保护/私有成员之间的TypeScript中存在这种不一致的原因吗?
答案 0 :(得分:2)
这是为了防止从其他类型访问私有/受保护成员。
来自https://github.com/Microsoft/TypeScript/issues/7755:
考虑这样的事情
class Foo { private versionNumber = 10; public compareTo(other: Foo) { return this.getVersion() === other.getVersion(); } private getVersion() { return this.versionNumber; } } class Bar { private myName = 'default;' public compareTo(other: Bar) { return this.myName === other.myName; } private getVersion() { /* ... DANGEROUS CODE HERE ...*/ return -1; } }
通过检查,永远不会调用
Bar#getVersion
- 它是私有的 方法,并且没有从始发类调用它。那 对于没有主动尝试的代码,检查应该足够了 在typechecker周围工作。但是这段代码确实调用了
Bar#getVersion
:let f = new Foo(); let b = new Bar(); f.compareTo(b);