TypeScript 无法在具有索引签名的对象上找到属性的定义,

3npbholx  于 6个月前  发布在  TypeScript
关注(0)|答案(8)|浏览(44)

在这里找到foo.x的定义是有效的:

const foo = {
  x: () => {

  }
}

foo.x // here

这个无法找到定义:

const foo: { [key: string]: any } = {
  x: () => {

  }
}

foo.x // here

我明白原则上为什么会这样,但在第二种情况下,我们不能只是乐观地尝试我们用于第一种情况的算法吗?如果它失败了,那么就无法找到定义?

1qczuiv0

1qczuiv01#

如果你使用的是Map类型,后者将起作用并强制执行你的类型。

type Key = "A" | "B" | "C"

const Mappings: {[key in Key]: number} = {
    A: 3,
    B: 6,
    C: 8
}

alert(Mappings.C)

我同意,但相当烦人。

yx2lnoni

yx2lnoni2#

@jameswilddev我不确定我是否理解,因为我仍然无法在Mappings.C上查看定义。

g9icjywg

g9icjywg3#

这是在TS 2.2中启用的功能,请参阅文档。在之前它是一个错误:

c:\test>type a.ts
const foo: { [key: string]: any } = {
  x: () => {

  }
}

foo.x // here

c:\test>tsc --v
Version 2.2.1

c:\test>tsc a.ts

c:\test>echo %ERRORLEVEL%
0
ht4b089n

ht4b089n4#

我认为你误解了我的问题?我不是在说属性访问是一个错误。我是在说使用“转到定义”功能,将我带到属性的定义处。

我刚刚安装了typescript@2.3.0-dev.20170306,并尝试在你的例子中在 foo.x 上使用“转到定义”,但仍然不起作用。

1wnzp6jl

1wnzp6jl5#

谢谢。我们应该修复这个问题。但是在你的第二个例子中,它不会去到 x: () => { ,而是会去到 { [key: string]: any } 。类型隐藏了 x 的定义。

dojqjjoe

dojqjjoe6#

非索引签名类型不能被保存在某个地方并用于尝试获取定义吗?这比简单地跳转到包含对象的定义要好得多。

11dmarpk

11dmarpk7#

根据你的类型注解,foo的类型是{ [key: string]: any }。你已经将其初始化为{ x: ()=>void },但这并不会改变类型。考虑不要在声明上添加类型注解。

piv4azn7

piv4azn78#

当前,这将转到索引签名的定义,这是在这里提到的预期结果。问题可以关闭,cc @jakebailey

相关问题