Estendentesi Array a macchina

voti
32

Come aggiungere un metodo per un tipo di base, ad esempio Array? Nel modulo globale questo sarà riconosciuto

interface Array {
   remove(o): Array;
}

ma dove mettere l'attuazione effettiva?

È pubblicato 09/10/2012 alle 15:33
fonte dall'utente
In altre lingue...                            


5 risposte

voti
45

È possibile utilizzare il prototipo di estendere Array:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Risposto il 09/10/2012 a 16:11
fonte dall'utente

voti
27

declare globalsembra essere il biglietto a partire dal dattiloscritto 2.1. Si noti che Array.prototypeè di tipo any[], quindi se si vuole avere la funzione di implementazione controlli sulla consistenza, meglio aggiungere un parametro di tipo generico da soli.

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);
  }
}
Risposto il 01/01/2017 a 04:47
fonte dall'utente

voti
6

Da dattiloscritto 1.6, è possibile "nativamente" estendere espressioni arbitrarie come tipi incorporati.

Cosa c'è di nuovo a macchina :

Tipografico 1.6 aggiunge il supporto per le classi estendono espressione arbitraria che calcola una funzione di costruzione. Ciò significa che i tipi built-in possono ora essere estesi in dichiarazioni di classe.

La clausola estende di una classe precedentemente richiesto un riferimento di tipo da specificare. Ora accetta un'espressione opzionalmente seguito da una lista tipo di argomento. Il tipo di espressione deve essere un tipo di funzione costruttore con almeno una firma costrutto che ha lo stesso numero di parametri di tipo come il numero di argomenti di tipo specificate nella clausola estende. Il tipo di ritorno della firma corrispondente costrutto (s) è il tipo di base da cui il tipo di istanza classe riceve. In effetti, questo permette entrambe le classi reali e le espressioni "class-like" da specificare nella clausola estende.

// Extend built-in types

class MyArray extends Array<number> { }
class MyError extends Error { }

// Extend computed base class

class ThingA {
    getGreeting() { return "Hello from A"; }
}

class ThingB {
    getGreeting() { return "Hello from B"; }
}

interface Greeter {
    getGreeting(): string;
}

interface GreeterConstructor {
    new (): Greeter;
}

function getGreeterBase(): GreeterConstructor {
    return Math.random() >= 0.5 ? ThingA : ThingB;
}

class Test extends getGreeterBase() {
    sayHello() {
        console.log(this.getGreeting());
    }
}
Risposto il 19/10/2015 a 15:03
fonte dall'utente

voti
3
class MyArray<T> extends Array<T> {
    remove: (elem: T) => Array<T> = function(elem: T) {
        return this.filter(e => e !== elem);
    }
}
let myArr = new MyArray<string>();
myArr.remove("some");

questo funziona per me con v2.2.1 dattiloscritto!

Risposto il 27/03/2017 a 15:14
fonte dall'utente

voti
2

L'aggiunta alla risposta di 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);
  }
}

Senza l'esportazione {} TS errore "potenziamenti per scope globale possono essere nidificati solo direttamente in moduli esterni o dichiarazioni di modulo ambientali."

Risposto il 28/03/2018 a 11:48
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more