MST

星途 面试题库

面试题:TypeScript函数类型重载在复杂业务场景下的优化

假设你正在开发一个电商系统的购物车模块,有一个添加商品到购物车的函数。商品有不同的类型(电子产品、服装等),不同类型商品添加到购物车时需要不同的处理逻辑(例如电子产品要检查库存,服装要检查尺码是否有货)。请使用TypeScript函数类型重载来实现这个添加商品到购物车的函数,并考虑如何优化代码以提高可维护性和扩展性。请详细说明实现思路和关键代码。
35.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用TypeScript的函数类型重载,为不同类型的商品定义不同的函数签名,这样可以在调用函数时根据传入商品类型进行正确的逻辑处理。
  2. 为了提高可维护性和扩展性,可以将每种商品类型的处理逻辑封装成独立的函数,在重载的函数中调用这些独立函数。

关键代码

// 定义商品类型
type Product = {
    id: number;
    name: string;
};

type ElectronicProduct = Product & {
    type: 'electronic';
    inventory: number;
};

type ClothingProduct = Product & {
    type: 'clothing';
    size: string;
    sizeInventory: { [size: string]: number };
};

// 定义添加商品到购物车的函数重载
function addProductToCart(product: ElectronicProduct): void;
function addProductToCart(product: ClothingProduct): void;
function addProductToCart(product: Product): void {
    if (product.type === 'electronic') {
        handleElectronicProduct(product);
    } else if (product.type === 'clothing') {
        handleClothingProduct(product);
    }
}

// 处理电子产品的逻辑
function handleElectronicProduct(product: ElectronicProduct) {
    if (product.inventory > 0) {
        console.log(`Added ${product.name} (electronic) to cart.`);
    } else {
        console.log(`Out of stock for ${product.name} (electronic).`);
    }
}

// 处理服装产品的逻辑
function handleClothingProduct(product: ClothingProduct) {
    if (product.sizeInventory[product.size] > 0) {
        console.log(`Added ${product.name} (clothing, size ${product.size}) to cart.`);
    } else {
        console.log(`Out of stock for ${product.name} (clothing, size ${product.size}).`);
    }
}

// 测试
const electronic: ElectronicProduct = {
    id: 1,
    name: 'Laptop',
    type: 'electronic',
    inventory: 10
};

const clothing: ClothingProduct = {
    id: 2,
    name: 'T - Shirt',
    type: 'clothing',
    size: 'M',
    sizeInventory: {
        'S': 5,
        'M': 3,
        'L': 2
    }
};

addProductToCart(electronic);
addProductToCart(clothing);

说明

  1. 商品类型定义:定义了通用的Product类型,以及ElectronicProductClothingProduct两种具体商品类型。
  2. 函数重载addProductToCart函数有两个重载签名,分别对应电子产品和服装产品。实际实现中根据商品类型调用不同的处理函数。
  3. 独立处理函数handleElectronicProducthandleClothingProduct分别封装了电子产品和服装产品添加到购物车的逻辑,这样如果需要修改某种商品的处理逻辑,只需要修改对应的函数,提高了可维护性。如果有新的商品类型,也可以方便地添加新的重载和处理函数,提高了扩展性。