Rozšíření Array na stroji

hlasů
32

Jak přidat metodu základním typem, řekněme Array? V globálním modulu to bude uznána

interface Array {
   remove(o): Array;
}

ale kam dát skutečnou realizaci?

Položena 09/10/2012 v 15:33
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
45

Můžete použít prototyp rozšířit Array:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Odpovězeno 09/10/2012 v 16:11
zdroj uživatelem

hlasů
27

declare globalZdá se, že vstupenka k strojopisem 2.1. Všimněte si, že Array.prototypeje typu any[], takže pokud chcete, aby vaše implementace funkce kontrolována konzistence, nejlépe přidat parametr obecný typ sami.

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);
  }
}
Odpovězeno 01/01/2017 v 04:47
zdroj uživatelem

hlasů
6

Od strojopisem 1.6, můžete „nativně“ rozšířit libovolné výrazy jako vestavěné typy.

Co je nového na stroji :

Psacím stroji 1.6 přidává podporu pro výuku vystupujících libovolný výraz, který vypočítá funkci konstruktoru. To znamená, že vestavěné typy mohou být nyní rozšířen v prohlášení třídy.

Extends klauzule třídy dříve vyžadovaly typové označení, které budou specifikovány. Nyní přijímá výraz popřípadě následuje seznam typ argumentu. Typ výrazu musí být typu funkce konstruktoru s alespoň jedním konstruktem podpisu, který má stejný počet parametrů typu jako počet argumentů typu uvedených v rozšiřuje platnosti. Návratový typ podpisu (y) odpovídající konstruktu je typ základnou typ instance třídy dědí. Efektivně, což umožňuje jak skutečné třídy a výrazy „class-like“, které mají být uvedeny v extends klauzule.

// 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());
    }
}
Odpovězeno 19/10/2015 v 15:03
zdroj uživatelem

hlasů
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");

to funguje pro mě strojopisem v2.2.1!

Odpovězeno 27/03/2017 v 15:14
zdroj uživatelem

hlasů
2

Přidání do Rikki Gibsona odpověď,

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 exportu {} TS chyba „rozšiřující systémy pro globální rozsah může být přímo vnořené pouze v externích modulů nebo prohlášení okolních modulů.“

Odpovězeno 28/03/2018 v 11:48
zdroj uživatelem

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