javascript - 是否可以仅针对 typescript 上的特定类型扩展 Array.prototype ?

标签 javascript arrays typescript generics

我有以下原型(prototype)扩展,因为我一直在使用大量 reduce:

declare interface Array<T> {
    sum(): T;
}

Array.prototype.sum = function() {
    return this.reduce((acc, now) => acc + now, 0);
};

是否可以强制仅输入数字的此扩展名?

最佳答案

当我写下这个问题时,我最终找到了如何做到这一点:

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);
    },
});

还应该注意的是,扩展基本原型(prototype)通常不是一个好主意 - 如果更改基本标准以实现新功能,您自己的代码库中可能会出现冲突。对于我的特定代码库上的这个特定示例,我觉得很好,因为 sum 是一个相当具有描述性的方法名称,并且在多种语言中非常常见,因此 future 的标准(可能)将具有兼容的实现。

关于javascript - 是否可以仅针对 typescript 上的特定类型扩展 Array.prototype ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061916/

相关文章:

javascript - 将表达式拆分为具有多个键的数组,并在数组中包含键

javascript - 使用嵌套的 for 循环比较两个对象的值并返回修改后的对象数组

typescript - 如何从函数的默认值推断类型?

angular - Angular 模板中的可选链接

Angular4/5 : how to create folder, 文本文件并使用 typescript 将数据写入该文件

javascript - 转到另一个页面并立即触发 ScrollTo

javascript - 如何在 CasperJS 中使用 JavaScript 从文档中检索 "just text"

java - 当 V 是 T 中的属性对象时,如何将数组 T[] 转换为 V[]

javascript - 当我需要内部 module._compile 时出现 NodeJS 错误

javascript - 毫秒到小时格式的转换