MST

星途 面试题库

面试题:TypeScript可选参数中?符号与类型推断的关联

在一个复杂的TypeScript项目中,有一个函数使用了?符号定义可选参数。请阐述在这种情况下,TypeScript的类型推断机制是如何工作的,特别是当函数被重载且部分重载版本涉及可选参数时,类型推断会受到哪些影响?给出具体代码示例并分析。
46.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. TypeScript 类型推断机制在可选参数中的工作原理

在 TypeScript 中,当函数定义了可选参数(使用 ? 符号)时,类型推断机制会根据函数调用时是否提供该参数来推断其类型。如果调用时未提供该可选参数,TypeScript 会推断其类型为 undefined。如果提供了参数,TypeScript 会根据传入值的类型进行推断。

2. 函数重载且部分重载版本涉及可选参数时对类型推断的影响

当函数被重载且部分重载版本涉及可选参数时,TypeScript 的类型推断会根据调用时提供的参数数量和类型,匹配最合适的重载版本。如果提供的参数数量和类型与某个重载版本完全匹配,则使用该版本的返回类型。如果提供的参数数量不足,TypeScript 会尝试匹配带有可选参数的重载版本。

3. 具体代码示例及分析

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

// 函数实现
function addNumbers(a: number, b?: number): number | undefined {
    if (b!== undefined) {
        return a + b;
    }
    return undefined;
}

// 调用示例 1:提供两个参数
const result1 = addNumbers(1, 2); // 类型推断为 number,因为匹配了第一个重载版本
console.log(result1); // 输出: 3

// 调用示例 2:只提供一个参数
const result2 = addNumbers(1); // 类型推断为 number | undefined,因为匹配了第二个重载版本
console.log(result2); // 输出: undefined

在上述代码中:

  • 我们首先对 addNumbers 函数进行了重载声明。第一个重载版本接受两个 number 类型参数并返回 number 类型。第二个重载版本接受一个 number 类型参数和一个可选的 number 类型参数,并返回 number | undefined 类型。
  • 在函数实现中,根据是否传入第二个参数来决定返回值。
  • 在调用 addNumbers 函数时,根据提供参数的情况,TypeScript 会正确推断返回值的类型。当提供两个参数时,匹配第一个重载版本,返回值类型为 number;当只提供一个参数时,匹配第二个重载版本,返回值类型为 number | undefined