MST

星途 面试题库

面试题:TypeScript中类和接口在复杂业务场景下的设计与优化

假设你正在开发一个电商系统,有商品(Product)、订单(Order)等业务实体。设计一组TypeScript接口来描述商品和订单的基本信息结构,例如商品包含`id`、`name`、`price`等,订单包含`orderId`、`products`(商品数组)等。然后创建相应的类来实现这些接口,要求考虑到数据验证、继承关系(如不同类型商品的特殊属性)以及性能优化(比如合理使用抽象类、接口的可选属性等)。请详细阐述你的设计思路并编写完整代码。
20.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 接口设计
    • 定义Product接口,包含商品的基本属性如idnameprice。由于可能存在不同类型商品的特殊属性,部分属性可设为可选。
    • 定义Order接口,包含订单orderId以及商品数组products
  2. 类的设计
    • 创建Product抽象类实现Product接口,提供基本的数据验证逻辑,例如价格不能为负数。
    • 针对不同类型商品,创建继承自Product抽象类的具体商品类,如ElectronicsProduct,可添加电子产品特有的属性。
    • 创建Order类实现Order接口,可在构造函数中对订单数据进行验证,如确保商品数组不为空。
  3. 性能优化
    • 使用可选属性减少不必要的内存开销,只有在实际需要时才设置这些属性。
    • 抽象类用于提取公共逻辑,避免重复代码,提升性能和可维护性。

代码实现

// 商品接口
interface ProductInterface {
    id: number;
    name: string;
    price: number;
    description?: string; // 可选属性
}

// 订单接口
interface OrderInterface {
    orderId: number;
    products: ProductInterface[];
}

// 商品抽象类
abstract class Product implements ProductInterface {
    constructor(public id: number, public name: string, public price: number, public description?: string) {
        if (price < 0) {
            throw new Error('Price cannot be negative');
        }
    }
}

// 电子产品商品类,继承自Product
class ElectronicsProduct extends Product {
    constructor(id: number, name: string, price: number, public warranty: number) {
        super(id, name, price);
    }
}

// 订单类
class Order implements OrderInterface {
    constructor(public orderId: number, public products: ProductInterface[]) {
        if (!products || products.length === 0) {
            throw new Error('Order must contain at least one product');
        }
    }
}