You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:51:00