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:

