首页 > 解决方案 > 为什么函数表达式和函数声明对一个变量有不同的推断结果?

问题描述

我有一个变量和三个函数:

const a: string | number = 3

function b(){
  console.log(a)               // string | number 
}
const c = function (){
  console.log(a)               // number
}
const d = () => {
  console.log(a)               // number
}

当我将这个词悬停a在函数b中时,我得到的是string | number

当我将这个词悬停a在函数c中时,我得到的是number

当我将这个词悬停a在函数d中时,我得到的是number

但不是a常数吗?在第一次被赋值之后,它3a推断为一种number类型。为什么在功能b上它还有机会成为string类型?

标签: typescript

解决方案


我相信这是因为功能提升。理论上,b可以在a明确分配其值之前调用:

b(); // <=====
const a: string | number = 3

function b(){
  console.log(a)               // string | number 
}
const c = function (){
  console.log(a)               // number
}
const d = () => {
  console.log(a)               // number
}

既不能从那里调用,也不能从那里调用,直到c明确分配之后才分配它们。d a

从运行时的角度来看,b尝试访问时会抛出对的调用,a因为a将在时间死区中,但从类型的角度来看,它会在 TypeScript 知道它是number.


推荐阅读