面试题答案
一键面试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类型推断工作原理如下:
调用函数时参数类型推断
- 匹配重载签名:当调用
add
函数时,TypeScript编译器会根据传入的参数类型,在函数的重载签名中查找匹配的签名。例如,如果传入两个数字add(1, 2)
,编译器会找到add(a: number, b: number): number
这个签名;如果传入两个字符串add('a', 'b')
,编译器会找到add(a: string, b: string): string
这个签名。 - 类型检查:一旦找到匹配的签名,编译器会检查传入参数的类型是否与签名中的参数类型兼容。如果不兼容,会抛出类型错误。
返回值类型推断
- 基于匹配签名:一旦确定了匹配的重载签名,返回值类型就由该签名定义。例如,当调用
add(1, 2)
匹配到add(a: number, b: number): number
签名时,返回值类型被推断为number
;当调用add('a', 'b')
匹配到add(a: string, b: string): string
签名时,返回值类型被推断为string
。 - 实际实现中的类型保护:在函数的实际实现部分(即那个通用的函数体),使用类型保护(如
typeof
检查)来确保在不同类型输入下的正确行为。如果输入类型不符合任何一个重载签名,函数会抛出错误,以保证类型安全。