TypeScript如何无需显式传参筛选类中Custom类型的键?
如何从类中筛选仅含Custom泛型类型的属性?
现有如下TypeScript代码,目标是从Test类创建一个仅包含Custom类型键的新映射类型。Custom仅作为泛型注解存在,无特殊实现。当前代码中CustomKeys会包含两个属性,但将判断条件改为extends Custom<string>时能正常筛选。请问有没有无需指定显式类型的实现方式?
type Custom<T extends any = unknown> = T; class Test { customProperty!: Custom<string>; notCustomProperty!: number; } type PickCustomKeys<T> = { [K in keyof T as T[K] extends Custom ? K : never]: T[K]; }; type CustomKeys = PickCustomKeys<Test>
问题原因
当前判断条件T[K] extends Custom会把Custom解析为默认的Custom<unknown>,而number extends unknown始终成立,所以notCustomProperty被错误地包含进来了。
解决方案
利用TypeScript的infer关键字,检测属性类型是否是Custom泛型的任意实例,无需指定具体泛型参数:
type Custom<T extends any = unknown> = T; class Test { customProperty!: Custom<string>; notCustomProperty!: number; } type PickCustomKeys<T> = { [K in keyof T as T[K] extends Custom<infer _> ? K : never]: T[K]; }; type CustomKeys = PickCustomKeys<Test>; // CustomKeys 类型仅包含 customProperty 属性
原理说明
Custom<infer _>会尝试将T[K]匹配到Custom的泛型结构,不管推断出的类型参数_具体是什么,只要属性是Custom包裹的类型,就会保留对应的键。这种方式可以适配Custom的任意泛型参数,无需显式指定。
内容的提问来源于stack exchange,提问作者Diyan Slavov
相关产品推荐
相关产品推荐

