是否可以仅针对打字稿上的特定类型扩展 Array.prototype?

Bad*_*shi 2 javascript arrays generics typescript

我有以下原型扩展,因为我一直在使用很多reduce:

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

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

是否可以强制仅输入此扩展名number?

Bad*_*shi 6

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

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);
    },
});
Run Code Online (Sandbox Code Playgroud)

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