实现思路
- 使用TypeScript的函数类型重载,为不同类型的商品定义不同的函数签名,这样可以在调用函数时根据传入商品类型进行正确的逻辑处理。
- 为了提高可维护性和扩展性,可以将每种商品类型的处理逻辑封装成独立的函数,在重载的函数中调用这些独立函数。
关键代码
// 定义商品类型
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);
说明
- 商品类型定义:定义了通用的
Product
类型,以及ElectronicProduct
和ClothingProduct
两种具体商品类型。
- 函数重载:
addProductToCart
函数有两个重载签名,分别对应电子产品和服装产品。实际实现中根据商品类型调用不同的处理函数。
- 独立处理函数:
handleElectronicProduct
和handleClothingProduct
分别封装了电子产品和服装产品添加到购物车的逻辑,这样如果需要修改某种商品的处理逻辑,只需要修改对应的函数,提高了可维护性。如果有新的商品类型,也可以方便地添加新的重载和处理函数,提高了扩展性。