typescript - Ako vylúčiť vlastnosti z rozhrania pri dedení


Mám dve rozhrania, X a Y. X má 2 vlastnosti, x1 a x2. Teraz Y chce dediť od X, ale nechce, aby sa dedia x2.

interface X {
  x1 : string;
  x2 : string;
}

interface Y extends X{
  // x2 shouldn't be available here
}

Keďže som nováčik v TypeScript, neviem na to prísť. Existuje v TypeScript nejaká zabudovaná vlastnosť typu extends X without x1?

POZNÁMKA: V mojom skutočnom prípade je X vstavané rozhranie. Takže to potrebujem urobiť bez zmeny X rozhrania. Je to možné?

Odpoveď č. 1

Typescript >3.5

TypeScript 3.5 zaviedol pomocný typ Omit, ktorý vytvára nový typ s niektorými vlastnosťami odstránenými z pôvodného. Príklad z dokumentácie:

type Person = {
    name: string;
    age: number;
    location: string;
};

type QuantumPerson = Omit<Person, "location">;

// equivalent to
type QuantumPerson = {
    name: string;
    age: number;
};

Vďaka Jeremymu za aktualizáciu o TypeScript 3.5!

Typescript >2.8

Toto je možné implementovať pomocou typov Pick a Exclude, ktoré boli zavedené v Typescripte 2.1 a 2.8:

/**
 * From T pick a set of properties K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

S týmito definíciami typov môžete konštruovať Omit<T,K> na vynechanie konkrétnych vlastností z generického typu:

/**
 * From T pick all properties except the set of properties K
 */
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

Aby sa uviedlo v poznámkach k vydaniu Typescript 2.8, prečo tento typ nie je zahrnutý v Typescript:

Nezahrnuli sme typ Omit, pretože sa dá jednoducho zapísať ako Pick<T, Exclude<keyof T, K>>.

Aj keď nie je súčasťou TypeScriptu, niekoľko knižníc poskytuje svoj vlastný podobný Omit typ, vrátane react-redux alebo Material-UI.

Tu je fungujúci príklad:

interface X {
  x1: string;
  x2: string;
}

type Y = Omit<X, 'x2'>;

let x: X = {
  x1: 'string1',
  x2: 'string2'
}

let y: Y = {
  x1: 'string1'
}

Všimnite si, že vlastnosti na vylúčenie budú skontrolované, je chybou vylúčiť vlastnosti, ktoré nie sú definované v určenej type:

Súvisiace články