扩展Array的原型而不是在typescript中构建

时间:2018-05-09 10:43:28

标签: javascript typescript webpack

在我基于TypeScript的应用程序中,我想为Array - 原型添加一些功能。

因此我在项目中添加了一个文件Array.d.ts,其中包含:

interface Array<T> {
    selectMany<TOut>(selectListFn: (t: T) => TOut[]): TOut[];
}

然后我在/Scripts/Extentsions/Array.ts下创建了另一个文件,我在其中实现了函数:

Array.prototype.selectMany = Array.prototype.selectMany || function<TIn, TOut>(selectListFn: (t: TIn) => TOut[]): TOut[] {
    return this.reduce((out, inx) => {
        out.push(...selectListFn(inx));
        return out;
    }, new Array<TOut>());
}

在另一个文件中,我将在DivisionResource[] - 数组中使用“扩展”,其中DivisionResource只是数组元素的具体类型。 Intellisense没有显示错误,但在运行webpack时会抛出

  

TS2339:'DivisionResource []'类型中不存在属性'selectMany'。

我不明白这里遗漏的是什么。

1 个答案:

答案 0 :(得分:0)

你应该使用“global”包装全局类型的合并,像这样;

declare global {
    interface Array<T> {
        selectMany<TOut>(selectListFn: (t: T) => TOut[]): TOut[];
    }
}

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

您还可以尝试将声明文件的三斜杠引用添加到.ts文件中。

/// <reference path="../Array.d.ts" />