在这里找到foo.x
的定义是有效的:
const foo = {
x: () => {
}
}
foo.x // here
这个无法找到定义:
const foo: { [key: string]: any } = {
x: () => {
}
}
foo.x // here
我明白原则上为什么会这样,但在第二种情况下,我们不能只是乐观地尝试我们用于第一种情况的算法吗?如果它失败了,那么就无法找到定义?
在这里找到foo.x
的定义是有效的:
const foo = {
x: () => {
}
}
foo.x // here
这个无法找到定义:
const foo: { [key: string]: any } = {
x: () => {
}
}
foo.x // here
我明白原则上为什么会这样,但在第二种情况下,我们不能只是乐观地尝试我们用于第一种情况的算法吗?如果它失败了,那么就无法找到定义?
8条答案
按热度按时间1qczuiv01#
如果你使用的是Map类型,后者将起作用并强制执行你的类型。
我同意,但相当烦人。
yx2lnoni2#
@jameswilddev我不确定我是否理解,因为我仍然无法在Mappings.C上查看定义。
g9icjywg3#
这是在TS 2.2中启用的功能,请参阅文档。在之前它是一个错误:
ht4b089n4#
我认为你误解了我的问题?我不是在说属性访问是一个错误。我是在说使用“转到定义”功能,将我带到属性的定义处。
我刚刚安装了typescript@2.3.0-dev.20170306,并尝试在你的例子中在
foo.x
上使用“转到定义”,但仍然不起作用。1wnzp6jl5#
谢谢。我们应该修复这个问题。但是在你的第二个例子中,它不会去到
x: () => {
,而是会去到{ [key: string]: any }
。类型隐藏了x
的定义。dojqjjoe6#
非索引签名类型不能被保存在某个地方并用于尝试获取定义吗?这比简单地跳转到包含对象的定义要好得多。
11dmarpk7#
根据你的类型注解,
foo
的类型是{ [key: string]: any }
。你已经将其初始化为{ x: ()=>void }
,但这并不会改变类型。考虑不要在声明上添加类型注解。piv4azn78#
当前,这将转到索引签名的定义,这是在这里提到的预期结果。问题可以关闭,cc @jakebailey