Extinderea Array-ului în TypeScript
Cum să adaugi o metodă unui tip de bază, să zicem Array? În modulul global acest lucru va fi recunoscut
interface Array {
remove(o): Array;
}
dar unde să pun implementarea efectivă?
Răspuns #1
Poți folosi prototipul pentru a extinde Array:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
Dacă vă aflați într-un modul, va trebui să clarificați că vă referiți la Array<T> global, nu că creați o interfață locală Array<T> în cadrul modulului dumneavoastră:
declare global {
interface Array<T> {
remove(o: T): Array<T>;
}
}
Răspunsul #2
declare global pare să fie soluția începând cu TypeScript 2.1. Rețineți că Array.prototype este de tip any[], așadar dacă doriți ca implementarea funcției dvs. să fie verificată pentru consistență, cel mai bine este să adăugați singur un parametru de tip generic.
declare global {
interface Array<T> {
remove(elem: T): Array<T>;
}
}
if (!Array.prototype.remove) {
Array.prototype.remove = function<T>(this: T[], elem: T): T[] {
return this.filter(e => e !== elem);
}
}
Răspunsul #3
Adăugând la răspunsul lui 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);
}
}
Fără export {}, vei primi eroarea TS:
Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.
