在 TypeScript 中,子类和父类的兼容性规则遵循面向对象编程的基本原则,即子类可以被视为父类的实例。这种兼容性主要体现在以下几个方面:
子类实例可以赋值给父类类型的变量:
子类继承了父类的所有属性和方法,因此子类实例可以赋值给父类类型的变量。
方法重载和重写:
子类可以重写父类的方法,但必须保持方法签名的一致性(参数类型和返回类型)。
类型兼容性:
TypeScript 使用结构类型系统(structural typing),这意味着只要两个类型的结构兼容,它们就可以互相赋值。
以下是一些示例代码来说明这些规则:
示例代码
父类和子类定义
class Parent {
name: string;
constructor(name: string) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Child extends Parent {
age: number;
constructor(name: string, age: number) {
super(name);
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old`);
}
}
子类实例赋值给父类类型的变量
const parent: Parent = new Parent("Alice");
const child: Parent = new Child("Bob", 10);
parent.greet(); // 输出: Hello, my name is Alice
child.greet(); // 输出: Hello, my name is Bob and I am 10 years old
方法重载和重写
class AnotherChild extends Parent {
greet() {
console.log(`Hi, I'm ${this.name}`);
}
}
const anotherChild: Parent = new AnotherChild("Charlie");
anotherChild.greet(); // 输出: Hi, I'm Charlie
类型兼容性
interface LikeParent {
name: string;
greet(): void;
}
const likeParent: LikeParent = new Child("Dave", 15);
likeParent.greet(); // 输出: Hello, my name is Dave and I am 15 years old
总结
子类实例可以赋值给父类类型的变量。
子类可以重写父类的方法,但必须保持方法签名的一致性。
TypeScript 使用结构类型系统,只要类型结构兼容,它们就可以互相赋值。
这些规则确保了子类和父类之间的兼容性,使得代码更加灵活和可维护。