TypeScript - Få type fra alle egenskaper som har en viss type


Jeg har et filterobjekt som kommer fra en OpenAPI-spesifikasjon; noe som dette:

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

Jeg vil gjerne lage en type fra det grensesnittet for filtre ved å velge typen til egenskapene:

Noe som:

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

Finnes det en innebygd funksjon for dette? Hvordan kan man oppnå ønsket resultat?

Svar #1

Du kan lage en nyttig type som følger:

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[]>

All ære går til @captain-yossarian fra Ukraina

Svar #2

Det finnes flere versjoner av typer som gjør dette. Den mest moderne bruker as-klausulen i kartlagte typer:

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[]>

Lekeromlenke

Du kan også bruke en lignende type for å velge egenskaper av en spesifikk type:

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[]>

Lekeromlenke

Relaterte artikler