【问题标题】:Typescript compiler not erroring on const with explicit typeTypescript 编译器不会在具有显式类型的 const 上出错
【发布时间】:2018-04-19 00:57:02
【问题描述】:

我假设这是故意行为,但这是出乎意料的。鉴于以下情况:

interface Foo {
  foo: number
}

interface Bar {
  bar: Foo
}

const BAR = 'bar'
const BAR2: string = 'bar'

function getBar(bar: Bar): boolean {
  return bar[BAR].foo // error, typescript can discern the value of `BAR` and reports that `number` is not assignable to `boolean`.
}

function getBar2(bar: Bar): boolean {
  return bar[BAR2].foo // typescript appears to not be able to discern the value of `BAR2`
}

我希望 Typescript 能够识别 BAR2 的值,因此能够识别 getBar 所做的无效函数返回类型的类型和错误。但似乎 Typescript 只知道 BAR2string

注意:打开noImplicitAny 会在getBar2 上暴露一个不同的错误,因为Bar 上没有索引签名

有人能解释一下为什么在 const 上显式键入会导致这种行为吗?

【问题讨论】:

  • 你能再明确一点吗?你的意思是字符串可以cast 到布尔值吗?此外,这并不是问题的症结所在,而是为什么 Typescript 无法识别 const 的值,因为它是被明确设置的?
  • 呃,没关系。我犯了一个错误。强制,转换,铸造。都是一样的意思。我不明白“辨别 BAR2 的价值”是什么意思。 foo 没有正确的类型?究竟出了什么问题?
  • 不用担心。问题是 Typescript 可以在将 const 显式初始化为没有类型的值时确定该值。但是当显式声明一种类型时,它不再能够确定显式初始化。

标签: typescript


【解决方案1】:

TypeScript 为变量 BAR 赋予了 "bar" 类型,因为那是它的初始值设定项。这意味着bar[BAR].foonumber,因为bar.bar.foonumber,这些东西的意思是一样的。

使用BAR2,您显式地覆盖了推理,因此它具有string 类型而不是"bar" 类型。当你通过字符串索引一个对象时,你会得到一个隐含的any

【讨论】:

  • 所以我遵循了除了“明确覆盖推理”之外的所有内容 - 它仍然是string,不是吗?而且它仍然应该能够识别显式值,因为它是这样初始化的,对吧?
  • 变量的 type 是字符串文字类型"bar",导致查找解析为已知变量。 : string 注释表示“这个变量类型为string”,因此不再发生解析。
  • 啊。知道了。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2023-04-10
  • 2018-10-23
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多