2017-02-20 2 views
0

私は追加のメソッド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で、それは完全に働きました。私は実際のバージョン2.2.0への写し(typescript)を更新するdesidedときしかし、私はこのコードhave changedのコンパイルを見つけた:今typescriptですがsuper()呼び出しから返された値に処理しますので、返されるオブジェクトは、結果

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

ですに電話してください。もちろん、そのプロトタイプはCircularArray.prototypeの代わりにArray.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]; 
}; 

をが、エラーが発生しました:

error TS2300: Duplicate identifier 'CircularArray'.
error TS2300: Duplicate identifier 'CircularArray'.

PS:Same question in Russian.

答えて

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]; 
}; 
関連する問題