为什么私有/受保护成员必须来自同一个类才能进行类型兼容?

时间:2017-04-02 01:39:49

标签: javascript oop typescript

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中存在这种不一致的原因吗?

1 个答案:

答案 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);