Estensione della matrice in TypeScript

Come aggiungere un metodo a un tipo di base, ad esempio Array? Nel modulo globale questo sarà riconosciuto

interface Array { remove(o): Array; } 

ma dove mettere la vera implementazione?

È ansible utilizzare il prototipo per estendere l’array:

 interface Array { remove(o: T): Array; } Array.prototype.remove = function (o) { // code to remove "o" return this; } 

declare global sembra essere il ticket di TypeScript 2.1. Nota che Array.prototype è di tipo any[] , quindi se vuoi che l’implementazione della tua funzione venga controllata per coerenza, meglio aggiungere un parametro di tipo generico tu stesso.

 declare global { interface Array { remove(elem: T): Array; } } if (!Array.prototype.remove) { Array.prototype.remove = function(elem: T): T[] { return this.filter(e => e !== elem); } } 

Da TypeScript 1.6, è ansible “nativamente” estendere espressioni arbitrarie come i tipi incorporati.

Novità in TypeScript :

TypeScript 1.6 aggiunge il supporto per le classi che estendono espressioni arbitrarie che calcolano una funzione di costruzione. Ciò significa che i tipi predefiniti possono ora essere estesi nelle dichiarazioni di class.

La clausola extends di una class richiedeva in precedenza un riferimento al tipo da specificare. Ora accetta un’espressione opzionalmente seguita da un elenco di argomenti di tipo. Il tipo dell’espressione deve essere un tipo di funzione di costruzione con almeno una firma di costruzione che abbia lo stesso numero di parametri di tipo del numero di argomenti di tipo specificato nella clausola di estensione. Il tipo di ritorno delle firme di costruzione corrispondenti è il tipo di base da cui eredita il tipo di istanza di class. In effetti, questo consente sia le classi reali che le espressioni “classiche” da specificare nella clausola extends.

 // Extend built-in types class MyArray extends Array { } 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()); } } 
 class MyArray extends Array { remove: (elem: T) => Array = function(elem: T) { return this.filter(e => e !== elem); } } let myArr = new MyArray(); myArr.remove("some"); 

questo funziona per me con typescript v2.2.1!

Aggiungendo la risposta di Rikki Gibson,

 export{} declare global { interface Array { remove(elem: T): Array; } } if (!Array.prototype.remove) { Array.prototype.remove = function(elem: T): T[] { return this.filter(e => e !== elem); } } 

Senza l’export {} Errore TS “Le agevolazioni per l’ambito globale possono essere nidificate direttamente solo in moduli esterni o dichiarazioni di moduli ambientali.”