1

通常の配列メソッドに加えて独自のメソッドを持つArrayから派生した新しいクラスを作りたいと思います。es6子クラスにメソッドを追加する

export class ObjectCollection<T extends Iidentifier> extends Array<T> { 

    constructor(collection: T[] = []) { 
    super(...collection); 
    } 

    // used for getting instance from a collection of objects 
    public getInstance(id: Id) { 
    return this.find(item => item.Id.toString() === id.toString()) || new 
    Array<T>(); 
    } 

} 

また、そのクラスを継承する子クラスもあります。

export class TargetCategories extends ObjectCollection<TargetCategory> { 

    constructor(categories: TargetCategory[] = []) { 
    super(categories); 
    } 

    public getCategoryType(id: Iidentifier): string { 
    return this[id].Category.length < 2 ? "dummy" : "saved"; 
    } 

} 

私がTargetCategoriesオブジェクトをインスタンス化するとき、私は配列にあるメソッドしか使用できません。私はgetCategoryTypeやgetInstanceのようなものを呼び出すことができません。

+1

実行時またはコンパイル時に?あなたはどんなエラーを出していますか?どのようにTargetCategoriesのインスタンスを作成して使用していますか? –

+0

新しいTargetCategories()を使って試してみましたが、インスタンスからそれらのメソッドにアクセスすることはできません。メソッドにアクセスできる唯一の方法は、TargetCategories.prototype.sayのようなクラスメソッドのように使用する場合です。 –

+0

コンパイル時またはランタイムエラーですか?あなたのコードを共有できますか?私はあなたのコードを使用し、欠けている部分を埋め、それは働き、コンパイルされ、クロムで動いた。 –

答えて

-1

私はそれをまとめて固定小バグを入れました。それは大丈夫です。

type Id = number; 
interface Iidentifier { 
    Id: number; 
} 

class ObjectCollection<T extends Iidentifier> extends Array<T> { 

    constructor(collection: T[] = []) { 
    super(...collection); 
    } 

    // used for getting instance from a collection of objects 
    public getInstance(id: Id) { 
    return this.find(item => item.Id.toString() === id.toString()) || new 
    Array<T>(); 
    } 

} 

interface TargetCategory extends Iidentifier { 
    Category: number[]; 
} 

class TargetCategories extends ObjectCollection<TargetCategory> { 

    constructor(categories: TargetCategory[] = []) { 
    super(categories); 
    } 

    public getCategoryType(id: Iidentifier): string { 
    return this[id.Id].Category.length < 2 ? "dummy" : "saved"; 
    } 
} 

let tc = new TargetCategories(); 
tc.getInstance(1); 
tc.getCategoryType({ Id: 2 }); 
+0

'Array'を拡張しないでください。 の移植方法とJavaScript実行時のコードによって、コードが壊れてしまいます。これは、ES2015への適切な移行パスを作成するための標準化団体の失敗です。現時点でこれを行う確実な方法はありません。 –

+0

@AluanHaddadそれは、それが働く可能性があることを意味しますか?そして、配列を完全にラップするのはどうですか?それはいくつかの仕事を与えるだろうが、それは信頼できるものではないだろうか? 'class MyArray は、配列を実装しています{private _array:Array ; } ' – Rodris

+0

はい、うまくいくかもしれないし、失敗するかもしれません...それは悲しいことです。 ラッピングは概念的には正しいアプローチですが、プロキシや別のES2015機能を使用せずに数値のプロパティアクセスを傍受する方法はありません。すべてが混乱している。 –

-1

私はそれが働く方法を見つけましたが、私はそれが唯一の方法、または最もクリーンな方法であるとは思わない。

interface IDifferentArray { 
    id: string | number; 
} 

export class DifferentArray<T extends IDifferentArray> extends Array<T> { 

    public lengthMessage:() => void; 
    public otherMethod:() => number; 

    constructor(items: Array<T> = []) { 
     super(...items); 

     this.lengthMessage = function() { 
      return `My length is ${this.length}`; 
     } 

     this.otherMethod = function() { 
      return 12; 
     } 
    } 
} 

ネイティブ配列のメソッドとプロパティにアクセスして、独自のインスタンスメソッドを追加できます。コンストラクタの外側に配置すると、クラスメソッドになります。

これは、通常のjavascriptで動作する方法です。私はes6/typescriptが実際のOOPをエミュレートすると思ったが、そうは思わなかった。

+0

これはOOPとは関係なく、ES5への移行を問題にする特定の振る舞いを持つ 'Array'のような特定の組み込み型を拡張することと関係しています。また、コードを記述しようとしている場合はJavaで行い、時間を無駄にしてしまいます。 –

関連する問題