Kiterjesztése Array géppel

szavazat
32

Hogyan adjunk egy módszert, hogy egy alap típus, mondjuk Array? A globális modul ezt fogják ismerni

interface Array {
   remove(o): Array;
}

de hová tegye a tényleges megvalósítás?

A kérdést 09/10/2012 15:33
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
45

Használhatja a prototípus kiterjeszteni Array:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Válaszolt 09/10/2012 16:11
a forrás felhasználó

szavazat
27

declare globalÚgy tűnik, hogy a jegy, mint a géppel 2.1. Megjegyzendő, hogy Array.prototypeez a típus any[], ezért ha azt szeretnénk, hogy a funkció végrehajtását ellenőrizni a következetesség, a legjobb, hogy adjunk egy általános típus paraméter magad.

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);
  }
}
Válaszolt 01/01/2017 04:47
a forrás felhasználó

szavazat
6

Tól géppel 1.6, akkor „natívan” meghosszabbítja tetszőleges kifejezések, mint a beépített típusok.

Mi az új géppel :

Gépelt 1.6 már támogatja az osztályok kiterjesztése tetszőleges kifejezés, amely kiszámítja egy konstruktor függvényt. Ez azt jelenti, hogy a beépített típusok is meg kell hosszabbítani az osztályban nyilatkozatokat.

A kiterjeszti kikötés egy osztály korábban szükséges a típusszámot meg kell határozni. Ez most elfogadja egy expressziós majd adott esetben egy típusú argumentum lista. A típus a kifejezést úgy kell konstruktor függvény típusú legalább egy konstrukciót aláírás, amely azonos számú típusú paraméterek száma típusú érvek megadott kiterjeszti kikötés. A visszatérési típus a megfelelő konstrukció aláírás (ok) a bázis típusa, amelyből a osztály példányát típusú örökli. Valójában ez lehetővé teszi, hogy mind a valós osztályok és az „osztály-szerű” kifejezést meg kell határozni az húzódik záradékot.

// 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());
    }
}
Válaszolt 19/10/2015 15:03
a forrás felhasználó

szavazat
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");

ez nekem működik a géppel V2.2.1!

Válaszolt 27/03/2017 15:14
a forrás felhasználó

szavazat
2

Hozzátéve, hogy Rikki Gibson választ,

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

Anélkül, hogy a kiviteli {} TS hiba „pontosságnöveléseket a globális hatókörű csak közvetlenül beágyazott külső modulok vagy a környezeti modul nyilatkozatokat.”

Válaszolt 28/03/2018 11:48
a forrás felhasználó

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