Vyhledávání na webu

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í:

  1. 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.

  1. 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).

Související články