绑定方法到对象后TSDoc信息丢失的原因排查
TSDoc在对象属性调用时丢失的原因
先看你遇到的代码场景:
/** foo is a method **/ let foo = ()=>{} foo() // 这里 hover 能正常显示TSDoc let obj={foo: foo} obj.foo() // 这里TSDoc丢失
这个现象的核心原因是TypeScript的类型推断逻辑不会保留变量的TSDoc元数据到新推断的类型上:
- 单独声明的
foo变量,TS会把你写的TSDoc直接绑定到这个变量的类型信息中,所以直接调用foo()时,编辑器能读取到对应的注释。 - 当你把
foo赋值给obj.foo并让TS自动推断obj的类型时,TS只会分析foo的类型结构(也就是() => void),然后为obj生成一个全新的类型{ foo: () => void },这个新类型不会携带原foo变量上的TSDoc注释。
如果想保留TSDoc,可以用两种方式解决:
- 显式定义接口并添加TSDoc
/** foo is a method **/ interface MyObject { /** foo is a method **/ foo: () => void; } let foo = ()=>{} let obj: MyObject = { foo } obj.foo() // 此时hover能看到TSDoc
- 使用
as const断言保留原变量的类型关联
/** foo is a method **/ let foo = ()=>{} let obj = { foo } as const; obj.foo() // TSDoc会被保留
内容的提问来源于stack exchange,提问作者zzzgoo
相关产品推荐
相关产品推荐

