TypeScript 拥有强大的类型推断系统。在大多数情况下,变量、参数和返回值的类型会根据上下文自动计算。类型推断有几个层次:
示例:
let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });
限制:如果编译器无法明确推断出类型,它将选择最宽泛的类型(通常为 any),这会失去类型化的优势。
如果没有明确指定,函数的参数会被类型化吗,但该函数后来使用了类型化的值?
错误答案:是的,TypeScript 总是自动 "猜测" 参数的类型。
正确答案:不是。如果函数的上下文包含类型信息,参数才会获得类型。否则,类型将是 any 或其他基本类型,这会导致错误。始终应明确类型化输入数据。
示例:
function f(x) { return x.toFixed(2); // 错误:x 的类型是 any }
故事
在项目中,没有明确指定自定义 React Hook 的返回值类型,TypeScript 没有发现类型可能是
undefined。结果,未检查的对象方法调用导致了运行时错误。
故事
创建一个混合类型值的数组时,最终类型自动推断为
any[]数组,因为未明确指定类型,这导致在后续代码中失去了所有类型化的优势。
故事
服务的输入参数验证没有类型化,而是依赖于 TypeScript 的“猜测”。在重构代码库后,自动推断得到了过于宽泛的类型,导致数据类型错误进入生产环境。