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

Posted

技术标签:

【中文标题】是否可以仅为打字稿上的特定类型扩展 Array.prototype?【英文标题】:Is it possible to extend Array.prototype only for a specific type on typescript? 【发布时间】:2018-06-12 05:09:39 【问题描述】:

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

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


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

是否可以强制只为number 键入此扩展名?

【问题讨论】:

既然函数sum 无论如何都可用于所有数组,为什么这样做有用?从Array 派生不是更有意义吗? 【参考方案1】:

当我写下这个问题时,我最终发现了如何去做:

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

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

【讨论】:

我不知道 javascript 类型的枚举,所以我做了一些研究,感谢您指出这一点。我更新了自己的答案。 FWIW,为了匹配其他函数值 Array.prototype 属性的配置方式,您需要在其中添加 writable: true, configurable: true

以上是关于是否可以仅为打字稿上的特定类型扩展 Array.prototype?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿上制作多种类型的属性接口

类型“typeof File”离子打字稿上不存在属性“moveFile”

如何在打字稿上重新连接(重新订阅)到 websocket

打字稿:使用特定的扩展接口来满足通用的“扩展”类型参数?

打字稿异步/等待不起作用

PropertyGrid:仅为特定属性删除自定义数据类型的属性