Extinderea Array-ului în TypeScript


Cum să adaugi o metodă unui tip de bază, să zicem Array? În modulul global acest lucru va fi recunoscut

interface Array {
   remove(o): Array;
}

dar unde să pun implementarea efectivă?

Răspuns #1

Poți folosi prototipul pentru a extinde Array:

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

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

Dacă vă aflați într-un modul, va trebui să clarificați că vă referiți la Array<T> global, nu că creați o interfață locală Array<T> în cadrul modulului dumneavoastră:

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

Răspunsul #2

declare global pare să fie soluția începând cu TypeScript 2.1. Rețineți că Array.prototype este de tip any[], așadar dacă doriți ca implementarea funcției dvs. să fie verificată pentru consistență, cel mai bine este să adăugați singur un parametru de tip generic.

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);
  }
}

Răspunsul #3

Adăugând la răspunsul lui Rikki Gibson,

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);
  }
}

Fără export {}, vei primi eroarea TS:

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