dědičnost - Je možné odstranit zděděné pole/metodu v dětské třídě/rozhraní?
Něco v tomto duchu:
interface A {
a: number;
x: any;
}
interface B extends A {
b: number;
}
interface C {
a: number;
b: number;
}
Takže B by bylo rovno C (vynecháním pole x, ale stále rozšiřující A). Je to možné? Pokud ano, jak?
Odpověď č. 1
Je nemožné odstranit děděné pole/metodu rozhraní v TypeScriptu.
Ale můžete to překonat přepracováním rozhraní:
Extrahovat základní rozhraní
interface BaseA { a: number; } interface A extends Base A { x: any; } interface B extends A { b: number; } interface C extends BaseA { b: number; }
Obě C a B budou převeditelné na BaseA.
Použijte volitelné pole
interface A { a: number; x?: any; } interface B extends A { b: number; } interface C extends A { b: number; }
Jsem si jistý, že existují i jiné způsoby v závislosti na konkrétním kontextu úkolu.
Odpověď č. 2
tady je další ne úplně elegantní způsob, jak se vypořádat s odstraňováním členů podřízeného rozhraní:
interface Base {
a: number;
x?: any;
}
interface Child extends Base {
x?: undefined;
}
tímto způsobem by pole x buď vůbec nemělo existovat, nebo pokud existuje, musí být nastaveno na undefined, což je ve většině případů stejně dobré jako neexistující (pokud se nesnažíte vyjmenovávat členy třídy nebo dělat podobné věci).
