typescript - Selectarea tuturor proprietăților, cu excepția celor specificate
Să spunem că am o interfață:
interface Buba {
k1: string;
k2: string;
k3: number;
}
Aș dori să creez un nou tip bazat pe această definiție cu toate proprietățile sale, cu excepția celor specificate. De exemplu, vreau să scap de k1. Este ceva de genul acesta măcar posibil?
type PickedBuba = Pick<Buba, !'k1'> // { k2: string, k3: number }
Răspuns #1
Se pare că am găsit o modalitate de a face asta. Vom avea nevoie de un tip ajutător StringOmit
type StringOmit<L1 extends string, L2 extends string> = ({ [P in L1]: P } &
{ [P in L2]: never } & { [key: string]: never })[L1];
Atunci putem să scriem propria noastră implementare a PickOmit
type PickOmit<O, K extends string> = Pick<O, StringOmit<keyof O, K>>;
Atunci soluția ar arăta ceva de genul acesta:
type PickedBuba = PickOmit<Buba, 'k1'> // { k2: string, k3: number }
EDITARE Cu Typescript 2.8 putem implementa Omit profitând de tipurile condiționale și de noul tip încorporat Exclude:
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
EDIT2 Cu TypeScript 3.5 avem, în sfârșit, un tip Omit integrat.
Răspunsul #2
Folosește doar noul tip Omit
interface Buba {
k1: string;
k2: string;
k3: number;
}
type PickedBuba = Omit<Buba, 'k1'> // { k2: string, k3: number }
