TypeScript 在字段排除之后,应跳转到属性签名定义,

li9yvcax  于 4个月前  发布在  TypeScript
关注(0)|答案(8)|浏览(67)

TypeScript 版本: master
代码

type OmitKeys<A, B> = {[P in Exclude<keyof A, B>]: A[P]}
interface Foo {
    a: number;
    b: string;
    c: boolean;
}
var c: OmitKeys<Foo, 'c'>;
c.a // goto definition doesn't work

预期行为:

c.a 上使用 Goto definition 会带我到 Foo.a 属性

实际行为:

Goto definition 不起作用

cfh9epnr

cfh9epnr1#

在这一点上,编译器实际上无法将关键点追溯到其声明。Exclude<keyof A, B>仅返回字面类型列表,然后Map类型生成具有相同名称的属性的新类型。

gab6jxml

gab6jxml2#

我知道并非所有事情都可能实现,但如果可能的话,您是否可以追踪这个符号的来源信息?
在上面的示例中,我们确实知道 a 符号来自代码中定义位置的 keyof Foo

jjhzyzn0

jjhzyzn03#

条件类型是一个非常强大的功能,但是如果没有定义这个行为,你也无法重命名或重构。

ql3eal8s

ql3eal8s4#

当它经过字面类型时,很可能就会丢失上下文。我们很乐意讨论如何添加这个功能的提案。

vfwfrxfs

vfwfrxfs5#

看起来似乎可以实现我们正在使用 I["a"],因此该属性来自于 I.a ?看起来我们可以在这里使 getRootSymbols 起作用。@sandersn

wlwcrazw

wlwcrazw6#

这是个角落案例,它不符合我们的预期,但无论如何,你的解决方案很好且简单。

wqlqzqxt

wqlqzqxt7#

为了保持整洁,自动关闭此问题。问题标签表明目前无法采取行动或已经得到解决。

gc0ot86w

gc0ot86w8#

这是一个关于设置一个指向原始符号的合成符号路径的问题。我不知道getIndexAccessType在处理0阶属性时是否会这样做。如果没有,那么这里就需要进行更改。

相关问题