TypeScript -从具有特定类型的所有属性中获取类型

3phpmpom  于 2023-01-27  发布在  TypeScript
关注(0)|答案(2)|浏览(162)

我有一个来自OpenAPI规范的过滤器对象;比如:

export interface Filters {
  field1: string[]
  field2: string[]
  field3: boolean
  field4: number
}

我想通过选择属性的类型从过滤器接口派生一个类型:
比如:

export type MultivalueFields = Select<Filters, string[]>
// type MultivalueFields = 'field1' | 'field2'

这有内在的规律吗?一个人怎样才能得到想要的结果?

a14dhokn

a14dhokn1#

您可以构建一个实用程序类型,如下所示:

type Values<T> = T[keyof T]
type Select<T, SelectType> = Values<{
  [Prop in keyof T]: T[Prop] extends SelectType ? Prop : never
}>

// typeof A = 'field1'
type A = Select<{field1: string[], field2: string}, string[]>

所有的功劳都归功于乌克兰的@captain-yossarian

dgenwo3n

dgenwo3n2#

有几个版本的类型可以做到这一点,最新的版本是在Map类型中使用as子句:

type Select<T, SelectType> = keyof {
  [Prop in keyof T as T[Prop] extends SelectType ? Prop : never]: any
}

// typeof A = 'field1'
type A = Select<{field1: string[], field2: string}, string[]>

Playground链接
也可以使用类似类型拾取特定类型的特性:

type PickByType<T, SelectType> = {
  [Prop in keyof T as T[Prop] extends SelectType ? Prop : never]: T[Prop]
}

// typeof A = { field1: string[]; }
type A = PickByType<{field1: string[], field2: string}, string[]>

Playground链接

相关问题