Typescript-verktygstyp för att extrahera egenskaper från ett gränssnitt som har en specificerad typ
Jag skulle vilja generera en ny objekttyp som endast har egenskaperna hos ett annat objekt som matchar de efterfrågade typerna. Som Pick gör, men med att specificera typerna och inte egenskapsnamnen.
Till exempel:
interface A {
a: string;
b: number;
c: string[];
d: { [key: string]: never };
}
interface B extends PickPropertyTypes<A, string | number>{}
Gränssnittet B bör bara ha egenskaperna a: string och b: number vilket resulterar i ett gränssnitt som
{
a: string;
b: number;
}
Är det möjligt?
Tack
Svar #1
interface A {
a: string;
b: number;
c: string[];
d: { [key: string]: never };
}
type PickPropertyTypes<T, V> = {
[K in keyof T as T[K] extends V ? K : never] : T[K]
}
type B = PickPropertyTypes<A, string | number>
// ^?
Svar #2
En annan lösning än den som redan presenterats är att först introducera en hjälptyp som extraherar nycklar av en given typ men endast nycklar som matchar kriterierna.
Endast då används hjälpartypen för att skapa den faktiska strukturella typen.
interface A {
a: string;
b: number;
c: string[];
d: { [key: string]: never };
}
type ExtractPropertyTypes<T, U> = { [K in keyof T]: T[K] extends U ? K : never; }[keyof T]
type PickPropertyTypes<T, V> = { [K in ExtractPropertyTypes<T, V>]: T[K] }
type Test = PickPropertyTypes<A, string | number>
Detta tillvägagångssätt efterliknar sättet Pick bygger på Extract och Omit på Exclude.
