MST

星途 面试题库

面试题:TypeScript默认参数与函数重载的交互处理

假设有一个函数,既需要使用默认参数,又要实现函数重载。请编写代码示例,展示如何在TypeScript中正确地实现这种需求,同时解释代码背后的逻辑和类型检查机制。
14.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

代码示例

// 函数重载声明
function addNumbers(a: number, b: number): number;
function addNumbers(a: number, b: number, c: number): number;

// 函数实现,使用默认参数
function addNumbers(a: number, b: number, c?: number): number {
    if (typeof c === 'number') {
        return a + b + c;
    }
    return a + b;
}

代码逻辑

  1. 函数重载声明
    • 首先通过多个函数声明来定义不同参数形式的函数,这就是函数重载。在上述代码中,声明了 addNumbers(a: number, b: number): numberaddNumbers(a: number, b: number, c: number): number,这两个声明定义了函数可以接受两个或三个参数的情况。
  2. 函数实现
    • 实际的函数实现中,使用了可选参数 c。当调用函数时,TypeScript会根据传入的参数个数和类型,匹配到合适的函数重载声明。如果传入两个参数,会匹配到 addNumbers(a: number, b: number): number 的声明;如果传入三个参数,会匹配到 addNumbers(a: number, b: number, c: number): number 的声明。
    • 在函数实现体中,通过 typeof c === 'number' 来判断是否传入了第三个参数 c,如果传入了则执行三个数相加,否则执行两个数相加。

类型检查机制

TypeScript 的类型检查机制在编译阶段工作。当调用 addNumbers 函数时,编译器会根据传入参数的个数和类型,与函数重载声明进行匹配。例如:

const result1 = addNumbers(1, 2); // 匹配addNumbers(a: number, b: number): number
const result2 = addNumbers(1, 2, 3); // 匹配addNumbers(a: number, b: number, c: number): number
// 以下调用会报错,因为没有匹配的函数重载声明
// const result3 = addNumbers(1); 

如果传入的参数无法匹配任何一个函数重载声明,TypeScript 编译器会报错,确保代码的类型安全。