Daktilo Array genişletme

oy
32

Nasıl bir taban türü için bir yöntem eklemek için, Diziyi demek? Küresel modülde bu tanınacak

interface Array {
   remove(o): Array;
}

ama nereye gerçek uygulama koymak?

Oluştur 09/10/2012 saat 15:33
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
45

Sen Array uzatmak için prototip kullanabilirsiniz:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Cevap 09/10/2012 saat 16:11
kaynak kullanıcı

oy
27

declare globaltypescript 2.1 itibariyle bilet gibi görünüyor. Not Array.prototypetiptedir any[], böylece fonksiyon uygulama tutarlılık açısından kontrol yapmak istiyorsanız, iyi bir genel tür parametresi ne kendinizi ekleyin.

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);
  }
}
Cevap 01/01/2017 saat 04:47
kaynak kullanıcı

oy
6

Typescript 1.6 itibaren, "doğal" dahili türleri gibi keyfi ifadeler uzatabilir.

Ne typescript yenilikler :

Typescript 1.6 yapıcı işlevi hesaplar rasgele ifade uzanan sınıfları için destek sağlar. Bu yerleşik türleri artık sınıf beyanlarında uzatılabilir anlamına gelir.

bir sınıfın uzanan maddesi, daha önce belirtilen bir tip referans gerekmez. Artık, isteğe bağlı olarak bir tip bağımsız değişken listesi takip bir ifade kabul eder. İfade tipi madde uzanan belirtilen tür bağımsız değişkenleri sayısı tür parametreleri aynı sayıda, en az bir yapı imza ile yapıcı işlevi türü olmalıdır. uygun yapı imza (ler) in geri tip sınıfı örneği türü devraldığı baz türüdür. Etkili, bu maddeyi uzanır gerçek sınıflar ve "sınıf" gibi ifadeler hem de belirtilmesine olanak tanır.

// 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());
    }
}
Cevap 19/10/2015 saat 15:03
kaynak kullanıcı

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

Bu tutanak v2.2.1 ile benim için çalışıyor!

Cevap 27/03/2017 saat 15:14
kaynak kullanıcı

oy
2

Rikki Gibson'ın yanıta ekleme,

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

İhracat olmadan {} TS hatası "küresel kapsam için Augmentation'lar sadece doğrudan dış modülleri veya ortam modül beyanlarında iç içe olabilir."

Cevap 28/03/2018 saat 11:48
kaynak kullanıcı

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