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]; 
    } 
} 

В машинописи 2.0.10 она работала отлично. Но когда я desided обновить машинописный до актуальной версии 2.2.0, я узнал, что составление этого кода have changed: Теперь машинопись обрабатывает значение, возвращенное из 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]; 
}; 

но получил ошибку:

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]; 
};