如何将函数导出为类?

时间:2017-02-20 12:49:04

标签: inheritance typescript

我希望使用其他方法get创建基于数组的类 最初我的代码看起来像这样:

export class CircularArray extends Array<string> {
    constructor(data: string[]) {
        super();
        this.push(...data);
    }

    get(i: number): string {
        return this[i % this.length];
    }
}

在typescript 2.0.10中它完美无缺。但当我决定将typescript更新为实际版本2.2.0时,我发现编译此代码have changed:now typescript处理super()调用返回的值:

function CircularArray(data) {
    var _this = _super.call(this) || this;
    _this.push.apply(_this, data);
    return _this;
}

因此返回的对象是对Array的调用的结果。当然,它的原型是Array.prototype而不是CircularArray.prototype,方法get丢失了。我该如何解决?

我试图做那样的事情:

export declare class CircularArray extends Array<string> {
    constructor(data: string[]);
    get(i: number): string;
}

export function CircularArray(data: string[]): CircularArray {
    this.push(...data);
    return this;
};

CircularArray.prototype = Object.create(Array.prototype);

CircularArray.prototype.get = function (i: number): string {
    return this[i % this.length];
};

但收到了错误:

  

错误TS2300:重复的标识符&#39; CircularArray&#39;   错误TS2300:重复的标识符&#39; CircularArray&#39;。

PS:Same question in Russian.

1 个答案:

答案 0 :(得分:0)

找到解决方案:

export interface CircularArray extends Array<string> {
    constructor(data: string[]): CircularArray;
    get(i: number): string;
}

export var CircularArray: { new (data: string[]): CircularArray } = function CircularArray(data: string[]): void {
    this.push(...data);
} as any;

CircularArray.prototype = Object.create(Array.prototype);

CircularArray.prototype.get = function (i: number): string {
    return this[i % this.length];
};