TypeScript中函数声明与函数表达式对变量类型推断结果不同的原因
TypeScript不同函数类型内变量类型提示差异原因
你为变量a显式标注了联合类型string | number,该标注优先级高于赋值的自动类型推断,因此TypeScript默认不会直接将a的类型收窄为number,只有在有明确上下文收窄依据时才会调整类型判断。
三种函数的类型提示差异来自TypeScript控制流分析的设计规则:
- 普通函数声明(
function b(){})存在提升特性,会被提升到当前作用域最顶部完成初始化。TypeScript的类型系统默认不会穿透普通函数声明做跨作用域的类型收窄——因为无法提前确认该函数的实际调用时机,类型系统为了保证全局场景下的类型安全性,会沿用a的原始标注类型string | number。 - 函数表达式(
const c = function(){})和箭头函数(const d = () => {})不存在提升特性,只有代码执行到对应声明行时才会完成函数初始化。此时TypeScript已经确认a被赋值为3,当前上下文下a的类型已经被收窄为number,因此这两类函数内部访问a时会沿用该收窄后的类型。
如果希望三个函数内的a都被识别为number,可以移除a的显式联合类型标注,直接写const a = 3即可,此时TypeScript会自动推断a为字面量类型3,三个函数内的类型提示会完全一致。
内容的提问来源于stack exchange,提问作者Chor
相关产品推荐
相关产品推荐

