TypeScript映射类型过滤属性键时JSDoc注释不显示如何解决
问题场景
需要为类创建对应的配置类型,满足以下要求:
- 仅包含原类的非函数属性
- 所有属性均为可选,效果与内置
Partial类型类似 - 自动过滤类中的函数成员
当前自定义类型已实现属性过滤逻辑,但IDE无法展示原属性绑定的JSDoc注释;作为对照,直接使用内置Partial<Person>的变量可以正常显示属性的JSDoc提示。
现有实现代码如下:
type Config<T> = { [P in keyof T as (T[P] extends Function ? never : P)]?: T[P]; }; class Person { /** * JSdoc must show for ID; */ public name = ""; /** * I don't want to have this one in Config */ public fn() { } } const config: Config<Person> = {name : "test"}; // 此处name无JSDoc提示 const config2 : Partial<Person> = {name: "test"}; // 此处name可正常显示JSDoc
问题原因
TypeScript语言服务对带as键重映射从句的映射类型,默认不会保留原属性与JSDoc注释的关联关系;而内置Partial属于无键重映射的同态映射类型,会自动透传原属性的元信息(包括JSDoc注释)。
修复方案
拆分类型逻辑,将「过滤非函数键」和「标记属性可选」两个逻辑拆分开,避免在同一个映射类型中使用键重映射同时处理可选修饰,让最终生成的Config类型成为同态映射类型,即可保留JSDoc透传能力。
修复后的类型定义:
// 先提取类型中所有非函数属性的键 type NonFunctionKeys<T> = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T] // 先Pick出所有非函数属性,再套Partial标记为可选 type Config<T> = Partial<Pick<T, NonFunctionKeys<T>>>
使用修复后的Config<Person>类型时,IDE既会自动过滤fn函数属性,也可以正常展示name属性绑定的JSDoc注释,与内置Partial的提示表现一致。
内容的提问来源于stack exchange,提问作者Merijn Schering
相关产品推荐
相关产品推荐

