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
