Rozszerzanie Array w maszynopisie

głosy
32

Jak dodać metodę do typu podstawowego, powiedzmy tablicy? W module globalnego zostanie to uznane

interface Array {
   remove(o): Array;
}

ale gdzie umieścić faktyczną realizację?

Utwórz 09/10/2012 o 15:33
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
45

Można użyć prototyp rozszerzyć tablicy:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Odpowiedział 09/10/2012 o 16:11
źródło użytkownik

głosy
27

declare globalWydaje się, że bilet jak maszynopisu 2.1. Zauważ, że Array.prototypejest typu any[], więc jeśli chcesz mieć swoją implementacją funkcji sprawdzane pod kątem spójności, najlepiej dodać parametr typu rodzajowego siebie.

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);
  }
}
Odpowiedział 01/01/2017 o 04:47
źródło użytkownik

głosy
6

Od maszynopis 1.6, można „natywnie” przedłużyć dowolnych wyrażeń takich jak wbudowanych typów.

Co nowego w maszynopisie :

Maszynopis 1.6 dodaje wsparcie dla zajęć rozciągających dowolny wyraz, który oblicza funkcję konstruktora. Oznacza to, że wbudowane typy mogą być teraz rozszerzone w deklaracji klasy.

Rozciąga punkt klasy wcześniej konieczne odwołanie Do określenia. Obecnie przyjmuje wyrażenie po czym ewentualnie liście typu argumentu. Typ ekspresji musi być typu konstruktor z co najmniej jedną sygnaturą konstrukt, który ma taką samą liczbę parametrów typu jako liczbę argumentów typu wyspecyfikowanego w części rozciąga punktu. Typ powrót Podpis (y) Dalsze konstruktu rodzaju, z których typ przykład klasa dziedziczy. Skutecznie, pozwala zarówno prawdziwe zajęcia i wyrażenia „klasa-like”, które zostaną określone w klauzuli rozszerza.

// 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());
    }
}
Odpowiedział 19/10/2015 o 15:03
źródło użytkownik

głosy
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 działa na mnie z maszynopis v2.2.1!

Odpowiedział 27/03/2017 o 15:14
źródło użytkownik

głosy
2

Dodając do odpowiedzi Rikki Gibsona,

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 eksportu {} TS błędach „rozszerzonych o zasięgu globalnym mogą być zagnieżdżone bezpośrednio tylko w modułach zewnętrznych lub deklaracji składanych otoczenia.”

Odpowiedział 28/03/2018 o 11:48
źródło użytkownik

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