MST

星途 面试题库

面试题:TypeScript类型推断在函数重载中的应用

编写一个TypeScript函数`add`,它有两种重载形式,一种接受两个数字参数并返回它们的和,另一种接受两个字符串参数并返回它们拼接后的结果。阐述在这种函数重载场景下,TypeScript类型推断是如何工作的,特别是在调用函数时参数类型和返回值类型的推断过程。
48.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: number | string, b: number | string): number | string {
    if (typeof a === 'number' && typeof b === 'number') {
        return a + b;
    } else if (typeof a ==='string' && typeof b ==='string') {
        return a + b;
    }
    throw new Error('参数类型不匹配');
}

在这种函数重载场景下,TypeScript类型推断工作原理如下:

调用函数时参数类型推断

  1. 匹配重载签名:当调用add函数时,TypeScript编译器会根据传入的参数类型,在函数的重载签名中查找匹配的签名。例如,如果传入两个数字add(1, 2),编译器会找到add(a: number, b: number): number这个签名;如果传入两个字符串add('a', 'b'),编译器会找到add(a: string, b: string): string这个签名。
  2. 类型检查:一旦找到匹配的签名,编译器会检查传入参数的类型是否与签名中的参数类型兼容。如果不兼容,会抛出类型错误。

返回值类型推断

  1. 基于匹配签名:一旦确定了匹配的重载签名,返回值类型就由该签名定义。例如,当调用add(1, 2)匹配到add(a: number, b: number): number签名时,返回值类型被推断为number;当调用add('a', 'b')匹配到add(a: string, b: string): string签名时,返回值类型被推断为string
  2. 实际实现中的类型保护:在函数的实际实现部分(即那个通用的函数体),使用类型保护(如typeof检查)来确保在不同类型输入下的正确行为。如果输入类型不符合任何一个重载签名,函数会抛出错误,以保证类型安全。