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 }

Relaterte artikler