MST

星途 面试题库

面试题:TypeScript函数的重载与联合类型

请编写一个TypeScript函数,使用函数重载来处理不同类型参数的加法操作,并且至少使用一种联合类型。说明函数重载的注意事项。
21.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 函数重载声明
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: number[], b: number[]): number[];
// 函数实现
function add(a: number | string | number[], b: number | string | number[]): number | string | number[] {
    if (typeof a === 'number' && typeof b === 'number') {
        return a + b;
    } else if (typeof a ==='string' && typeof b ==='string') {
        return a + b;
    } else if (Array.isArray(a) && Array.isArray(b)) {
        return a.map((num, index) => num + b[index]);
    }
    throw new Error('不支持的参数类型');
}

函数重载注意事项

  1. 声明在前,实现在后:函数重载需要先进行多个函数声明,这些声明具有相同的函数名,但参数列表不同。然后再提供一个函数实现,该实现需要能够处理所有重载声明的参数情况。
  2. 参数类型匹配:在调用函数时,TypeScript 会根据传入的参数类型来选择最合适的重载版本。所以重载声明的参数类型要能覆盖实际调用时可能传入的所有类型组合。
  3. 返回类型:不同的重载声明可以有不同的返回类型,具体取决于参数类型。但函数实现的返回类型必须能够兼容所有重载声明的返回类型。
  4. 顺序问题:在编写重载声明时,要注意顺序。通常更具体的重载声明应该放在前面,较通用的放在后面。因为 TypeScript 会按照声明的顺序来查找匹配的重载。例如,如果有一个针对 string 类型参数的重载和一个针对 any 类型参数的重载,string 类型参数的重载应该放在前面,否则针对 string 类型的调用可能会匹配到 any 类型的重载。