2017-12-19 16 views
1

Proxyを使用しようとしていますが、問題が発生しています。私はそうのようなクラスを持っている:拡張クラスでプロキシがメソッドを取得できない

export class Builder { 
    public doSomething(...args: (string | number | Raw | Object)[]): this { 
     // Do stuff 
     return this 
    } 
} 

export class ModelBase extends Builder { 
    protected _items = {} 
} 

export class Model extends ModelBase { 

    public constructor(options?: ModelSettings) { 
     super(options) 
     return new Proxy(this, { 
     get: function (target, property) { 
      return target._items[property] || target 
     } 
     }) 
    } 

    public static create() { 
     return new this() 
    } 

} 

私はそのようにようModelを拡張:

export class MyClass extends Model { 

    public constructor() { 
     super({/* Some options go here */}) 
     // Do some stuff 
    } 

    public static getItems() { 
     let t = this.create() 
     t.doSomething() 
    } 

} 

その後、私はgetItems()呼び出すクラスのインスタンスを作成します。私はこれを実行すると

MyClass.getItems() 

、私はエラーを取得する:

doSomething()がクラス ModelBase内にある

TypeError: t.doSomething is not a function

。私がコメントした場合、Proxyはいつものように動作します。だから、私は親クラスにアクセスできない理由を知りたい。

+0

'class'はキーワードです。これが問題に関連するかどうかは分かりませんが、私はあなたの変数 'class'を絶対に呼び出さないでしょう。 – Jacob

+0

私は実際に 'class'を使用していません、それは単なる例でした。私はそれを改名した。 –

+0

'model'または' modelBase'に '_items'プロパティがありますか?もしそうなら、項目には 'doSomething'メソッドがありますか? –

答えて

2

あなたのプロキシはtarget._items.doSomethingを検索しようとしていますが、存在しません。 target.doSomethingは存在しますが、それはそれを探していません。その結果、全体としてオブジェクトであるtargetが返されます。オブジェクトは関数ではないため、エラーです。

これを修正する方法は、プロキシで何を達成しようとしているかによって異なります。プロキシが注意しなければならない限られたプロパティセットがある場合は、それらを明示的にチェックすることができます。または、より一般的にはtarget[property]が存在するかどうかを確認してからtarget._items[property]に戻ってからtargetに戻ることがあります。繰り返しますが、それは達成しようとしているものによって異なります。

+0

データベースを照会すると、 'key 'がdbカラム名で' value'が値。 –

+0

'return target [property] ||のようになります。 target._items [property] 'は動作します。 –

関連する問題