typescript 子类继承父类后,子类对象赋值给父类,还不报错?

为何子类对象赋值给父类,还不报错?为什么,什么原理??求助
class a {
a: String;
}
class b extends a {
b: String;

}
class c extends b {
c: String;

}
let p1: a;
let p2: b;
let p3: c;
p2 = { 'a': 'String', 'b': 'String' }
p3 = { 'a': 'String', 'b': 'String', 'c': 'String' }
// p1 = p2
p2 = p3
console.log(p1,p2,p3)
图片描述

阅读 7.2k
2 个回答

看一下这一章的文档 类型兼容性

interface Named {
    name: string;
}

let x: Named;
// y's inferred type is { name: string; location: string; }
let y = { name: 'Alice', location: 'Seattle' };
x = y;

这里要检查 y 是否能赋值给 x,编译器检查 x 中的每个属性,看是否能在 y 中也找到对应属性。 在这个例子中,y 必须包含名字是 namestring 类型成员。y 满足条件,因此赋值正确。

console.log(x.name) // 正确
console.log(x.location) // 报错提醒

当你在 x 中用 location 的时候 typescript 就会给你报错提醒

子类实例赋给父类引用当然不会报错,不光是typescript,所有oop都允许这样,比如java,c#,c++。相反比如父类实例赋给子类引用则会报错。

原理是,对oop的继承语法的有这么一层含义:子类的实例也是合法的父类实例,既然子类实例也是父类的实例,为何不能赋给父类的变量?当然可以。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进