Rozšiřování pole v TypeScriptu
Jak přidat metodu k základnímu typu, řekněme k Array? V globálním modulu to bude rozpoznáno
interface Array {
remove(o): Array;
}
ale kam umístit samotnou implementaci?
Odpověď č. 1
Můžete použít prototyp k rozšíření pole:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
// code to remove "o"
return this;
}
Pokud se nacházíte uvnitř modulu, budete muset jasně uvést, že odkazujete na globální Array<T>, a ne vytváříte lokální rozhraní Array<T> ve svém modulu:
declare global {
interface Array<T> {
remove(o: T): Array<T>;
}
}
Odpověď č. 2
declare global se zdá být řešením od TypeScript 2.1. Vezměte na vědomí, že Array.prototype je typu any[], takže pokud chcete, aby byla vaše implementace funkce kontrolována na konzistenci, je nejlepší přidat si generický typový parametr sami.
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);
}
}
Odpověď č. 3
K odpovědi Rikkiho Gibsona,
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);
}
}
Bez export {} dostanete chybu TS:
Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.
