Utvide Array i Loggfila

stemmer
35

Hvordan legge til en metode til en base type, sier Array? I den globale modulen vil bli gjenkjent

interface Array {
   remove(o): Array;
}

men hvor du skal plassere den faktiske gjennomføringen?

Publisert på 09/10/2012 klokken 14:33
kilden bruker
På andre språk...                            


5 svar

stemmer
47

Du kan bruke prototypen for å utvide Array:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Svarte 09/10/2012 kl. 15:11
kilden bruker

stemmer
30

declare globalsynes å være billetten pr Loggfila 2,1. Vær oppmerksom på at Array.prototypeer av type any[], så hvis du vil ha din funksjon implementering sjekket for konsistens, best å legge en generisk type parameter selv.

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);
  }
}
Svarte 01/01/2017 kl. 04:47
kilden bruker

stemmer
6

Fra Loggfila 1.6, kan du "opprinnelig" forlenge vilkårlige uttrykk som innebygde typer.

Hva er nytt i Loggfila :

Maskinskrevet manuskript 1.6 gir støtte for klasser som strekker seg vilkårlig uttrykk som beregner en konstruktør funksjon. Dette betyr at innebygde typer kan nå bli utvidet i klassen erklæringer.

Den strekker seg leddet til en klasse tidligere krevde en type som referanse for å spesifiseres. Den godtar nå et uttrykk eventuelt etterfulgt av en type argumentliste. Typen av uttrykket må være en konstruktør funksjonstypen med i det minste en konstruksjon signatur som har det samme antall typeparametere som antallet av type argumenter som er angitt i den strekker leddet. Returtypen av den tilsvarende konstruksjon signatur (r) er basistypen fra hvilken klasse forekomst typen arver. Effektivt, gir dette både reelle klasser og "klasse-lignende" uttrykk for å være spesifisert i går klausulen.

// 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());
    }
}
Svarte 19/10/2015 kl. 15:03
kilden bruker

stemmer
3

Legge til Rikki Gibson svar,

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

Uten eksport {} TS feil "kanselliet for det globale omfang bare kan direkte nestet i eksterne moduler eller modulomgivelses erklæringer".

Svarte 28/03/2018 kl. 11:48
kilden bruker

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

dette fungerer for meg med Loggfila v2.2.1!

Svarte 27/03/2017 kl. 15:14
kilden bruker

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