MST

星途 面试题库

面试题:TypeScript 接口与多态性的关系及应用

阐述 TypeScript 接口在实现多态性方面的作用。举例说明在复杂业务场景下,如何利用接口来设计具有多态特性的模块,并分析这样做对代码可维护性和扩展性的影响。
21.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

TypeScript 接口在实现多态性方面的作用

  1. 定义规范:接口定义了对象的形状(shape),即对象应包含哪些属性和方法。在多态性实现中,接口为不同类型的对象提供了统一的契约。不同类只要实现了相同的接口,就可以在相同的上下文中被使用,从而表现出多态性。
  2. 类型检查:TypeScript 的静态类型检查机制通过接口确保实现类遵循特定的结构。这有助于在编译阶段发现类型不匹配问题,保证多态实现的正确性。

复杂业务场景下利用接口设计多态特性模块示例

假设我们正在开发一个电商系统,其中有不同类型的商品,如电子产品、服装等,每种商品都有不同的计算价格的逻辑。

  1. 定义接口
// 定义商品接口
interface Product {
    id: number;
    name: string;
    calculatePrice(): number;
}
  1. 实现具体商品类
// 电子产品类
class ElectronicProduct implements Product {
    id: number;
    name: string;
    constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
    }
    calculatePrice(): number {
        // 电子产品价格计算逻辑,例如基础价格加上 10% 的税
        let basePrice = 100;
        return basePrice * 1.1;
    }
}

// 服装类
class ClothingProduct implements Product {
    id: number;
    name: string;
    constructor(id: number, name: string) {
        this.id = id;
        this.name = name;
    }
    calculatePrice(): number {
        // 服装价格计算逻辑,例如基础价格加上 5% 的运费
        let basePrice = 50;
        return basePrice * 1.05;
    }
}
  1. 使用多态特性
// 购物车类,接受一个 Product 数组并计算总价
class ShoppingCart {
    products: Product[] = [];
    addProduct(product: Product) {
        this.products.push(product);
    }
    calculateTotalPrice(): number {
        return this.products.reduce((total, product) => total + product.calculatePrice(), 0);
    }
}

// 使用示例
let cart = new ShoppingCart();
let electronic = new ElectronicProduct(1, '手机');
let clothing = new ClothingProduct(2, 'T恤');

cart.addProduct(electronic);
cart.addProduct(clothing);

console.log(cart.calculateTotalPrice());

对代码可维护性和扩展性的影响

  1. 可维护性
    • 清晰的结构:接口明确了不同模块之间的交互方式,使得代码结构更加清晰。例如在上述电商系统中,通过 Product 接口,很容易理解不同商品类需要提供哪些功能,以及购物车如何与商品进行交互。
    • 易于修改:当需要修改某个商品类的价格计算逻辑时,只要保持接口不变,不会影响到其他依赖该接口的模块,如购物车模块。这降低了修改代码带来的风险,提高了可维护性。
  2. 扩展性
    • 方便添加新类型:如果要添加新类型的商品,比如食品类,只需要创建一个实现 Product 接口的 FoodProduct 类即可,无需修改购物车等现有模块的代码。这使得系统能够轻松应对业务需求的变化,具有良好的扩展性。
    • 遵循开闭原则:通过接口实现多态性,符合开闭原则,即软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。在不修改现有代码的情况下,可以方便地扩展系统功能。