面试题答案
一键面试定义printValue
函数
function printValue(value: number): void;
function printValue(value: string): void;
function printValue(value: boolean): void;
function printValue(value: number | string | boolean) {
if (typeof value === 'number') {
console.log(value * value);
} else if (typeof value ==='string') {
console.log(value.length);
} else if (typeof value === 'boolean') {
console.log(!value);
}
}
可能遇到的类型注解问题及解决方案
-
类型联合导致的不确定性
- 问题:在函数实现部分,当使用联合类型(如
number | string | boolean
)时,TypeScript 编译器无法直接确定value
的确切类型,这可能导致类型检查不够精确。例如,在函数实现中,如果直接对value
调用length
属性,编译器会报错,因为不是所有联合类型中的类型都有length
属性。 - 解决方案:使用类型保护(type guards),如
typeof
操作符。在上述代码中,通过typeof value ==='string'
这样的判断语句,确保只有在value
确实是字符串类型时,才调用length
属性。
- 问题:在函数实现部分,当使用联合类型(如
-
函数重载的签名匹配问题
- 问题:在定义多个重载签名时,可能会出现实际实现函数的签名与重载签名不匹配的情况。例如,如果实现函数的参数类型与重载签名不一致,TypeScript 编译器会报错。
- 解决方案:仔细检查实现函数的参数类型和返回类型,确保其与所有重载签名兼容。实现函数的参数类型应该是所有重载签名参数类型的联合,返回类型应该与所有重载签名的返回类型一致(在这个例子中是
void
)。
-
类型推断不准确
- 问题:在复杂的代码结构中,TypeScript 的类型推断可能无法准确推断出函数参数的类型,导致重载函数调用错误。例如,当函数作为回调函数传递时,TypeScript 可能无法正确推断出应该调用哪个重载版本。
- 解决方案:显式地提供类型注解。在调用
printValue
函数时,如果类型推断不准确,可以手动指定参数的类型,例如printValue(1 as number)
,这样可以确保调用正确的重载版本。