TypeScript映射类型用as关键字过滤字段后代码提示失效如何解决
问题原因
TS 语言服务(负责代码补全的模块)对使用 as 子句做键重映射的自定义映射类型兼容存在缺陷,当你输入第一个合法属性后,TS 会提前对泛型 T 做类型收窄,丢失了剩余可选属性的补全提示。
解决方案
把自定义重映射的过滤逻辑替换为基于内置 Pick 工具类型的实现,TS 对内置工具类型的补全支持更完善,即可解决提示丢失的问题:
type Doc = Record<string, any> // 先提取所有非函数类型的键 type NonFunctionKeys<T extends Doc> = { [K in keyof T]: T[K] extends () => void ? never : K }[keyof T] // 用Pick构造过滤后的类型,替代原来的as重映射写法 type DocFilter<T extends Doc> = Pick<T, NonFunctionKeys<T>> const doc1 = {aaaa:'',bbbb:1,c:()=>{}} function test2 <T extends Partial<DocFilter<typeof doc1>>>(opt:{prop:T}){} test2({ prop:{ aaaa:'', b // 此时输入b可以正常提示bbbb字段 } })
补充说明
修改后的 DocFilter 和你原本的实现语义完全等价,不会改变原有类型校验逻辑,只是调整了类型构造方式适配TS语言服务的补全规则。
内容的提问来源于stack exchange,提问作者missannil
相关产品推荐
相关产品推荐

