MST

星途 面试题库

面试题:TypeScript交叉类型与泛型在类继承中的协同应用

设计一个TypeScript类继承体系,其中父类使用泛型来定义属性的类型,子类通过交叉类型来扩展父类的功能,并且要体现出交叉类型与泛型协同工作的优势。请编写相关代码,并解释这种协同如何增强代码的灵活性和可维护性。
12.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 父类使用泛型定义属性类型
class GenericClass<T> {
    value: T;
    constructor(value: T) {
        this.value = value;
    }
}

// 定义一个交叉类型的接口,用于扩展功能
interface ExtendedFunctionality {
    extendedMethod(): void;
}

// 子类通过交叉类型扩展父类功能
class SubClass<T> extends GenericClass<T> implements ExtendedFunctionality {
    extendedMethod(): void {
        console.log(`The value is: ${this.value}`);
    }
}

// 示例使用
let subClassInstance = new SubClass<string>("Hello, World!");
subClassInstance.extendedMethod();

交叉类型与泛型协同工作的优势解释

  1. 灵活性增强
    • 泛型:使得父类GenericClass可以适应多种不同的数据类型,而不需要为每种类型重复编写类似的代码。比如GenericClass<number>GenericClass<string>等都可以正常工作,增强了代码在数据类型层面的灵活性。
    • 交叉类型:子类SubClass通过实现ExtendedFunctionality接口(交叉类型的体现),在继承父类功能的基础上,又添加了额外的功能extendedMethod。这使得SubClass既保留了泛型带来的类型灵活性,又能添加特定的功能,从而在功能层面也增强了灵活性。例如,无论是SubClass<number>还是SubClass<string>的实例,都拥有extendedMethod方法。
  2. 可维护性增强
    • 泛型:如果需要修改父类GenericClass针对属性value的一些操作逻辑,只需要在一处修改,所有使用不同类型参数实例化的GenericClass及其子类SubClass都会受到影响,避免了在多处重复修改相同逻辑的代码,减少了维护成本。
    • 交叉类型:通过接口ExtendedFunctionality来定义扩展功能,使得代码结构更加清晰。如果需要对扩展功能进行修改或添加新的扩展功能,只需要在接口及其实现(子类SubClassextendedMethod)处进行操作,而不会影响到父类GenericClass的泛型相关逻辑。这种模块化的设计使得代码在维护时更加容易理解和修改。