Vyhledávání na webu

Rozšiřování pole v TypeScriptu


Jak přidat metodu k základnímu typu, řekněme k Array? V globálním modulu to bude rozpoznáno

interface Array {
   remove(o): Array;
}

ale kam umístit samotnou implementaci?

Odpověď č. 1

Můžete použít prototyp k rozšíření pole:

interface Array<T> {
    remove(o: T): Array<T>;
}

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}

Pokud se nacházíte uvnitř modulu, budete muset jasně uvést, že odkazujete na globální Array<T>, a ne vytváříte lokální rozhraní Array<T> ve svém modulu:

declare global {
    interface Array<T> {
        remove(o: T): Array<T>;
    }
}

Odpověď č. 2

declare global se zdá být řešením od TypeScript 2.1. Vezměte na vědomí, že Array.prototype je typu any[], takže pokud chcete, aby byla vaše implementace funkce kontrolována na konzistenci, je nejlepší přidat si generický typový parametr sami.

declare global {
  interface Array<T> {
    remove(elem: T): Array<T>;
  }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(this: T[], elem: T): T[] {
    return this.filter(e => e !== elem);
  }
}

Odpověď č. 3

K odpovědi Rikkiho Gibsona,

export {}

declare global {
    interface Array<T> {
        remove(elem: T): Array<T>;
    }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
      return this.filter(e => e !== elem);
  }
}

Bez export {} dostanete chybu TS:

Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.

Související články