L'extension de tableau dactylographié

voix
32

Comment ajouter une méthode à un type de base, par exemple tableau? Dans le module global ce sera reconnu

interface Array {
   remove(o): Array;
}

mais où mettre la mise en œuvre effective?

Créé 09/10/2012 à 15:33
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
45

Vous pouvez utiliser le prototype d'étendre Tableau:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Créé 09/10/2012 à 16:11
source utilisateur

voix
27

declare globalsemble être le ticket au tapuscrit 2.1. Notez que Array.prototypeest de type any[], donc si vous voulez avoir votre implémentation de la fonction contrôlée par souci de cohérence, préférable d'ajouter un paramètre de type générique vous - même.

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);
  }
}
Créé 01/01/2017 à 04:47
source utilisateur

voix
6

De tapuscrit 1.6, vous pouvez « nativement » étendre les expressions arbitraires comme types intégrés.

Quoi de neuf dans tapuscrit :

Tapuscrit 1.6 ajoute le support pour les classes étendant expression arbitraire qui calcule une fonction de constructeur. Cela signifie que les types intégrés peuvent désormais être étendus dans les déclarations de classe.

La clause EXTENDS d'une classe requise au préalable une référence de type à préciser. Il accepte maintenant une expression éventuellement suivie d'une liste d'arguments de type. Le type de l'expression doit être un type de fonction de construction avec au moins une signature de construction qui a le même nombre de paramètres de type que le nombre d'arguments de type spécifié dans la clause se prolonge. Le type de retour de la signature de l'assemblage correspondant (s) est le type de base à partir duquel le type d'instance de la classe hérite. En effet, cela permet à la fois de vraies classes et « classe » comme expressions à préciser dans la clause EXTENDS.

// 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());
    }
}
Créé 19/10/2015 à 15:03
source utilisateur

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

cela fonctionne pour moi avec tapuscrit v2.2.1!

Créé 27/03/2017 à 15:14
source utilisateur

voix
2

Ajout à la réponse de Rikki Gibson,

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

Sans l'exportation {} erreur TS « Augmentations pour la portée globale ne peuvent être directement imbriqués dans des modules externes ou des déclarations du module ambiant. »

Créé 28/03/2018 à 11:48
source utilisateur

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