typescript - Velge alle egenskaper bortsett fra spesifiserte
La oss si at jeg har et grensesnitt:
interface Buba {
k1: string;
k2: string;
k3: number;
}
Jeg vil gjerne lage en ny type basert på denne definisjonen med alle dens egenskaper bortsett fra de spesifiserte. For eksempel ønsker jeg å kvitte meg med k1. Er noe slikt overhodet mulig?
type PickedBuba = Pick<Buba, !'k1'> // { k2: string, k3: number }
Svar #1
Det ser ut til at jeg har funnet en måte å gjøre det på. Vi vil trenge en hjelpertype StringOmit
type StringOmit<L1 extends string, L2 extends string> = ({ [P in L1]: P } &
{ [P in L2]: never } & { [key: string]: never })[L1];
Da kan vi skrive vår egen implementering av PickOmit
type PickOmit<O, K extends string> = Pick<O, StringOmit<keyof O, K>>;
Da vil løsningen se noe slik ut:
type PickedBuba = PickOmit<Buba, 'k1'> // { k2: string, k3: number }
REDIGER Med Typescript 2.8 kan vi implementere Omit ved å utnytte betingede typer og den nye innebygde typen Exclude:
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
REDIGER2 Med TypeScript 3.5 har vi endelig en innebygd Omit-type.
Svar #2
Bare bruk den nye Omit-typen
interface Buba {
k1: string;
k2: string;
k3: number;
}
type PickedBuba = Omit<Buba, 'k1'> // { k2: string, k3: number }
