TypeScript如何基于指定前缀key从已有类型提取子集类型?
这个需求完全可以实现。
问题原因
你尝试的Pick<Foo, filtered${string}>写法逻辑是正确的,报错是因为该写法仅支持 TypeScript 4.5 及以上版本,低版本TS无法直接通过模板字面量模式自动匹配提取符合条件的key。
兼容解决方案
可以通过自定义泛型工具类型实现全版本兼容的前缀key过滤,有两种常用写法:
写法1:使用映射类型键重映射(推荐,TS 4.1及以上支持)
// 泛型工具类型:提取T中所有前缀为Prefix的key构成新类型 type FilterKeysByPrefix<T, Prefix extends string> = { [K in keyof T as K extends `${Prefix}${string}` ? K : never]: T[K] } // 实际使用 type Bar = FilterKeysByPrefix<Foo, 'filtered'>
写法2:结合Pick实现
// 先提取符合前缀要求的key的联合类型 type MatchPrefixKeys<T, Prefix extends string> = keyof T extends infer K ? K extends string ? K extends `${Prefix}${string}` ? K : never : never : never // 再通过Pick选取对应key type Bar = Pick<Foo, MatchPrefixKeys<Foo, 'filtered'>>
两种写法最终得到的Bar类型都和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者Guerric P
相关产品推荐
相关产品推荐

