La extensión de la matriz a máquina de escribir

votos
32

Cómo agregar un método a un tipo base, por ejemplo la matriz? En el módulo global este será reconocido

interface Array {
   remove(o): Array;
}

pero donde poner la implementación real?

Publicado el 09/10/2012 a las 15:33
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
45

Puede usar el prototipo de extender la matriz:

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

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
Respondida el 09/10/2012 a las 16:11
fuente por usuario

votos
27

declare globalparece ser el boleto como mecanografiadas 2.1. Tenga en cuenta que Array.prototypees de tipo any[], así que si usted quiere tener su aplicación con control de función para mantener la coherencia, la mejor manera de añadir un parámetro de tipo genérico sí mismo.

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);
  }
}
Respondida el 01/01/2017 a las 01:47
fuente por usuario

votos
6

De mecanografiado 1.6, puede "nativa" extender expresiones arbitrarias como tipos incorporados.

¿Qué hay de nuevo a máquina de escribir :

Mecanografiado 1.6 añade soporte para las clases que se extienden expresión arbitraria que calcula una función constructora. Esto significa que los tipos incorporados ahora se pueden extender en las declaraciones de clase.

La cláusula se extiende de una clase requiere previamente una referencia de tipo que se determine. Se acepta ahora una expresión opcionalmente seguido de una lista de tipos de argumento. El tipo de la expresión debe ser un tipo de función constructor con al menos una firma constructo que tiene el mismo número de parámetros de tipo como el número de argumentos tipo especificado en el extiende cláusula. El tipo de retorno de la firma (s) construcción de coincidencia es el tipo de base de la que el tipo de instancia clase hereda. Efectivamente, esto permite que ambas clases reales y expresiones de "clase-como" que se especifican en la cláusula se extiende.

// 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());
    }
}
Respondida el 19/10/2015 a las 12:03
fuente por usuario

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

esto funciona para mí con v2.2.1 mecanografiado!

Respondida el 27/03/2017 a las 12:14
fuente por usuario

votos
2

Agregando a la respuesta 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);
  }
}

Sin la exportación {} TS error "Augmentations para el ámbito global sólo pueden ser anidados directamente en módulos externos o declaraciones módulo ambiente."

Respondida el 28/03/2018 a las 08:48
fuente por usuario

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