【发布时间】:2021-02-07 20:16:09
【问题描述】:
我正在尝试使用一些自定义方法扩展基本Array 接口。我查看了 SO 和 typescript 文档,最后将以下代码放在一起:
// In module Func.ts
declare global {
type Array<T> = {
intersperse(mkT: (ix: number) => T): T[];
};
}
if (!('intersperse' in Array.prototype)) {
Array.prototype.intersperse = function intersperse<T>(this: T[], mkT: (ix: number) => T): T[] {
return this.reduce((acc: T[], d, ix) => [...acc, mkT(ix), d], []).slice(1);
};
}
但是,我收到以下错误:
// On type Array<T> = { ... }
Duplicate identifier 'Array'.ts(2300)
// On Array.prototype.intersperse = ...
Property 'intersperse' does not exist on type 'any[]'.ts(2339)
另外,每当我尝试在其他文件中使用 intersperse 时,我都会收到错误消息
Property 'intersperse' does not exist on type 'Element[]'.ts(2339)
这是意料之中的,考虑到Func.ts 中的声明似乎不起作用。据此,我认为 SO 问题已经过时(或不完整),并且从那以后发生了一些变化。
那么,为了摆脱这些错误并扩展 Array 原型,最好的扩展方法是什么?在你说我不应该这样做之前——是的,我知道all the risks,而且我还是做出了明智的决定。
【问题讨论】:
-
如果您要扩展原生原型,请确保您的扩展是不可枚举的,方法是使用带有适当标志的
Object.defineProperty。 -
@T.J.Crowder 好主意,我没想到!谢谢。
-
@str 我知道即使我包含“我做出了明智的决定还是要这样做”部分,也会有人抱怨我在做什么。我知道你的意思是好的,但它仍然很有趣,
-
@str 公平点。谢谢你。我将编辑我的问题以包含您当时发布的链接。
标签: arrays typescript interface prototype