MST

星途 面试题库

面试题:TypeScript中super与类型兼容性及多态性

在TypeScript中,当涉及到复杂的类型兼容性和多态性场景时,super关键字会对代码行为产生怎样的影响?请结合泛型、抽象类等概念进行分析并给出代码示例。
33.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. super关键字在TypeScript复杂类型场景中的作用

  • 在抽象类与继承中的作用:在TypeScript里,抽象类作为一种不能被实例化,只能被继承的类,为子类提供了一个通用的框架。super关键字用于在子类中调用父类(抽象类)的构造函数、方法等。这在处理多态性时非常关键,因为子类虽然有自己的独特实现,但可能需要复用父类的一些基础逻辑。
  • 与泛型结合的影响:泛型允许我们在定义函数、类或接口时不指定具体类型,而是在使用时再确定类型。当super与泛型一起使用时,它有助于保持类型的一致性和灵活性,使得在不同类型实例化的情况下,子类依然能正确调用父类的相关成员。

2. 代码示例

// 定义一个抽象类,使用泛型
abstract class Animal<T> {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    abstract makeSound(): T;
}

// 子类继承抽象类,这里T被具体化为string类型
class Dog extends Animal<string> {
    constructor(name: string) {
        // 使用super调用父类构造函数
        super(name); 
    }
    makeSound(): string {
        return `Woof! My name is ${this.name}`;
    }
}

class Cat extends Animal<string> {
    constructor(name: string) {
        super(name);
    }
    makeSound(): string {
        return `Meow! My name is ${this.name}`;
    }
}

// 创建实例
const myDog = new Dog('Buddy');
const myCat = new Cat('Whiskers');

console.log(myDog.makeSound()); 
console.log(myCat.makeSound()); 

在上述代码中,Animal是一个抽象类,使用了泛型TDogCat类继承自Animal,在它们的构造函数中通过super调用了Animal的构造函数来初始化name属性。makeSound方法在子类中有不同的实现,但都遵循了Animal抽象类定义的契约。这里通过泛型和super关键字,实现了类型的灵活定义以及父类逻辑的复用,展示了在复杂类型兼容性和多态性场景下super关键字的重要作用。