面试题答案
一键面试类型推断工作原理
TypeScript 的类型推断是在编译阶段,编译器根据代码中的上下文信息自动推导出变量、函数参数和返回值的类型。它遵循一定的规则,例如在变量声明并初始化时,会根据初始值推断变量类型;函数返回值类型会根据 return
语句推断等。
函数参数和返回值的类型推断场景
- 函数参数类型推断
function add(a, b) { return a + b; } let result = add(5, 3); // 这里 TypeScript 能根据传入的 5 和 3 推断出函数 add 的参数 a 和 b 为 number 类型
- 函数返回值类型推断
function multiply(a: number, b: number) { return a * b; } let product = multiply(2, 4); // 由于函数体内返回值是 a * b (两个 number 相乘),TypeScript 推断出返回值为 number 类型
类型推断失效的情况及解决方法
- 函数无返回值或返回值复杂
- 情况:如果函数没有
return
语句,或者return
语句的逻辑很复杂,类型推断可能失效。 - 解决方法:显式声明返回值类型。
function printMessage(message: string): void { console.log(message); // 这里没有返回值,显式声明返回值类型为 void } function complexFunction(): number { let num = Math.random(); if (num > 0.5) { return 1; } else { return 2; } // 这里返回值逻辑复杂,显式声明返回值类型为 number }
- 情况:如果函数没有
- 函数参数类型依赖于外部变量
- 情况:当函数参数类型依赖于外部变量,且外部变量类型不确定时,类型推断可能不准确。
- 解决方法:显式声明参数类型。
let value; function processValue(val) { // 这里 value 类型不确定,导致 val 类型推断可能不准确 return val.toUpperCase(); } function betterProcessValue(val: string) { return val.toUpperCase(); }
- 使用
any
类型- 情况:如果变量或函数参数使用了
any
类型,类型推断会失效,因为any
类型表示可以是任何类型,编译器无法进行准确推断。 - 解决方法:避免过度使用
any
类型,尽量使用具体的类型。
let data: any = 'hello'; function logData(d) { console.log(d.length); // 这里 d 为 any 类型,类型推断失效,不知道 d 是否有 length 属性 } let strData: string = 'world'; function betterLogData(d: string) { console.log(d.length); // 这里显式声明 d 为 string 类型,类型推断准确 }
- 情况:如果变量或函数参数使用了