MST

星途 面试题库

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

在TypeScript的类继承中,假设父类有一个方法`parentMethod`,子类重写了这个方法`childMethod`,在`childMethod`中使用`super.parentMethod()`。如果父类的方法签名发生变化,可能会影响到子类中`super`的调用。请详细说明在这种情况下TypeScript是如何进行类型检查的,并给出一个相关的代码示例展示可能出现的问题及解决办法。
33.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

类型检查机制

在TypeScript中,当子类重写父类方法并通过super调用父类方法时,TypeScript会确保子类方法的参数和返回值类型与父类方法的类型兼容。如果父类方法签名发生变化,TypeScript会根据新的签名检查子类中super调用的参数是否匹配。如果不匹配,TypeScript会在编译阶段报错。

代码示例及问题

class Parent {
    parentMethod(name: string): string {
        return `Hello, ${name}`;
    }
}

class Child extends Parent {
    childMethod(): void {
        let result = super.parentMethod(123); // 这里会报错,因为参数类型不匹配
        console.log(result);
    }
}

在上述示例中,Parent类的parentMethod接受一个string类型的参数,而在Child类的childMethod中使用super.parentMethod调用时传入了number类型的参数,这会导致TypeScript编译报错。

解决办法

  1. 修正参数类型:确保super调用时传入的参数类型与父类方法签名匹配。
class Parent {
    parentMethod(name: string): string {
        return `Hello, ${name}`;
    }
}

class Child extends Parent {
    childMethod(): void {
        let result = super.parentMethod('world');
        console.log(result);
    }
}
  1. 更新父类和子类方法签名:如果父类方法签名变化是合理的,同时更新子类方法的实现和调用。
class Parent {
    parentMethod(id: number): string {
        return `ID: ${id}`;
    }
}

class Child extends Parent {
    childMethod(): void {
        let result = super.parentMethod(1);
        console.log(result);
    }
}

这样,通过正确匹配参数类型或更新方法签名,就可以避免因父类方法签名变化导致的super调用问题。