MST

星途 面试题库

面试题:TypeScript 函数重载与联合类型在复杂业务场景下的应用

假设你正在开发一个电商平台的购物车模块,有一个函数需要根据不同的用户权限(普通用户、会员用户、管理员)对添加到购物车的商品进行不同的操作(如普通用户限购数量、会员用户可享受折扣、管理员可修改商品信息)。请分别使用函数重载和联合类型来实现这个功能,并分析两种实现方式在可维护性和扩展性上的优缺点。
40.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

使用函数重载实现

// 函数重载声明
function handleCartItem(userType: '普通用户', item: any, quantity: number): void;
function handleCartItem(userType: '会员用户', item: any, quantity: number): void;
function handleCartItem(userType: '管理员', item: any, newInfo: any): void;

// 函数实现
function handleCartItem(userType: string, item: any, arg: any): void {
    if (userType === '普通用户') {
        const limit = 10;
        if (arg > limit) {
            console.log('普通用户限购10件');
        } else {
            console.log('已将商品添加到购物车');
        }
    } else if (userType === '会员用户') {
        const discount = 0.9;
        const price = item.price * discount;
        console.log(`会员用户享受折扣,商品价格为 ${price}`);
    } else if (userType === '管理员') {
        item = {...item, ...arg };
        console.log('已修改商品信息');
    }
}

使用联合类型实现

type UserType = '普通用户' | '会员用户' | '管理员';
interface CartItem {
    // 商品信息相关类型定义
    [key: string]: any;
}
function handleCartItem(userType: UserType, item: CartItem, quantityOrInfo: number | CartItem): void {
    if (userType === '普通用户') {
        const limit = 10;
        if (typeof quantityOrInfo === 'number' && quantityOrInfo > limit) {
            console.log('普通用户限购10件');
        } else {
            console.log('已将商品添加到购物车');
        }
    } else if (userType === '会员用户') {
        const discount = 0.9;
        const price = item.price * discount;
        console.log(`会员用户享受折扣,商品价格为 ${price}`);
    } else if (userType === '管理员') {
        if (typeof quantityOrInfo === 'object') {
            item = {...item, ...quantityOrInfo };
            console.log('已修改商品信息');
        }
    }
}

优缺点分析

函数重载

  • 可维护性
    • 优点:函数重载通过不同的函数声明,使代码结构更加清晰,对于不同用户类型的操作一目了然,易于理解和维护。
    • 缺点:如果操作逻辑变得复杂,函数实现体中的条件判断可能会增多,维护成本会有所上升。
  • 扩展性
    • 优点:当需要新增用户类型或操作时,只需添加新的函数重载声明和在实现体中增加对应的条件分支,扩展相对容易。
    • 缺点:随着用户类型和操作的增多,函数重载声明会变得冗长,可能导致代码可读性下降。

联合类型

  • 可维护性
    • 优点:代码相对简洁,通过联合类型在一个函数中处理多种情况,减少了代码冗余。
    • 缺点:函数内部的逻辑判断可能会变得复杂,需要通过类型判断来区分不同的操作,增加了理解和维护的难度。
  • 扩展性
    • 优点:添加新的用户类型或操作时,只需在联合类型中增加新的值,并在函数内部增加对应的类型判断逻辑,相对灵活。
    • 缺点:随着业务逻辑的扩展,函数内部的类型判断逻辑会变得更加复杂,可能导致代码可读性和可维护性降低。