TypeScript中如何提取类型内值为指定类型的键生成联合类型
解决方案
该需求完全可以实现,通过 TypeScript 内置的映射类型与条件类型组合即可完成,具体操作如下:
步骤1:确认基础类型
你给出的基础类型定义如下:
type LabelValue = { label: string value: string } type Person = { firstName: string lastName: string age: number pets: LabelValue[] details: LabelValue[] }
步骤2:封装通用筛选工具类型
我们可以封装一个泛型工具类型,通用实现「从指定类型中筛选值匹配目标类型的键」的能力:
/** * 从类型 T 中筛选出值类型为 U 的所有键,组成联合类型 */ type PickKeysByType<T, U> = { // 遍历T的所有键,值符合U则保留键名,否则返回never [K in keyof T]: T[K] extends U ? K : never }[keyof T] // 取所有属性值的联合,never会被自动过滤
如果需要严格匹配类型(避免条件类型的分布式特性对联合类型产生意外结果),可以调整为用元组包裹判断逻辑:
type PickKeysByType<T, U> = { [K in keyof T]: [T[K]] extends [U] ? K : never }[keyof T]
步骤3:获取目标联合类型
直接调用上面的工具类型即可得到预期结果:
type PersonLabelValueKeys = PickKeysByType<Person, LabelValue[]> // 等价于 type PersonLabelValueKeys = "pets" | "details"
内容的提问来源于stack exchange,提问作者Stephan Olsen
相关产品推荐
相关产品推荐

