【问题标题】:Type is changing in TypeScriptTypeScript 中的类型正在发生变化
【发布时间】:2023-03-24 14:36:02
【问题描述】:

谁能解释它是如何发生的以及为什么? 是错误还是我错过了什么?

function isString<T>(arg:T):boolean {
     return (typeof(arg)==='string')?true:false;
}

let myEcho;
myEcho = isString;
let myInt :number = 5;
console.log(myInt  + ", Type is "+ typeof(myInt)) // 5, Type is number
myInt = myEcho("hi");
console.log(myInt  + ", Type is "+ typeof(myInt)) //  true, Type is boolean

我将 myInt 定义为一个数字,但它变成了布尔值!!!

【问题讨论】:

  • 您将其 first 定义为一个数字,方法是为其分配 5(一个数字),但随后您将一个布尔值(myEcho("hi") 的结果)重新分配给它变量(myInt),覆盖初始值(5)。
  • @AlexSzabó 在 TypeScript 中,我们无法更改变量的类型,但在这里它会发生变化。问题是它为什么会改变?
  • 我的猜测是 myEcho 是 any 类型(因为它声明时没有类型并且它无法推断函数的类型 isString - 更具体地说,我认为它无法推断出输入该函数的签名),所以它不会抱怨。

标签: typescript types typescript-generics


【解决方案1】:

我在 Twitter 上 ping Titian Cernicova-Dragomir 关于此问题,因为您说肯定没有错误,但我无法想象会影响此的设置。有一个!

您似乎禁用了noImplicitAny。当您禁用该功能时,TypeScript 不会尝试优化隐式具有 any 类型的变量类型,例如您的 myEcho。所以 TypeScript 不知道 myEcho("hi") 返回什么,并让分配给你的 myInt 变量不报告。 Here's an example 在 TypeScript 操场上,noImplicitAny 禁用。

启用noImplicitAny(最佳实践)后,该代码会在myInt = myEcho("hi"); 语句上从TypeScript 编译器产生错误:

类型“布尔”不能分配给类型“数字”。

Live copy showing the error here

但即使出现错误,TypeScript 编译器的默认行为仍然是生成 JavaScript 输出(如果可以,在这种情况下也可以)。所以在 runtime 你会看到你所描述的行为,因为myInt 确实包含boolean(来自myEcho),而不是number,并且你正在使用JavaScript 的运行时@ 987654337@运营商。

注意来自 TypeScript 编译器的错误。在那里你会发现像这样的类型错误。

您还可以使用--noEmitOnError compiler option 告诉 TypeScript 不 在出现错误时输出 JavaScript。

【讨论】:

  • 我在另一个 TS 版本 3.7.5 的系统上进行了尝试,并且没有出现错误。
  • @Hesama - 好吧,大概您使用的是相同的 tsconfig.json 或类似名称。正如我上面所说,重要的是禁用noImplicitAny。您在哪个系统上运行代码似乎无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2019-10-06
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多