javascript - ¿Es posible extender Array.prototype solo para un tipo específico en TypeScript?
Tengo la siguiente extensión de prototipo porque he estado usando mucho reduce:
declare interface Array<T> {
sum(): T;
}
Array.prototype.sum = function() {
return this.reduce((acc, now) => acc + now, 0);
};
¿Es posible forzar que esta extensión sea tipada solo para number?
Respuesta #1
Mientras escribía la pregunta, terminé descubriendo cómo hacerlo:
declare interface Array<T> {
sum(this: Array<number>): number;
}
Object.defineProperty(Array.prototype, 'sum', {
value: function(this: Array<number>): number {
return this.reduce((acc, now) => acc + now, 0);
},
});
También debe tenerse en cuenta que extender prototipos básicos normalmente no es una buena idea; en caso de que se modifique el estándar base para implementar nueva funcionalidad, podría haber un conflicto en su propia base de código. Para este ejemplo en particular en mi base de código específica, considero que está bien, ya que sum es un nombre de método bastante descriptivo y muy común en varios lenguajes, por lo que un estándar futuro (probablemente) tendrá una implementación compatible.
