2016-05-27 12 views
2

活字体: 私は方法getTableDataとのDataProviderクラスのメソッドがあります。活字体は:ジェネリッククラスにパラメータとしてジェネリック型を渡す

public static getTableData<T extends DataObject>(type: { new(): T}): Array<T> { ... } 

これは完璧に動作したとき、私のコード:

let speakers = DataProvider.getTableData(Speaker); // where Speaker is a class 

これをジェネリッククラスから呼びたいと思います。

export class ViewModelBase<T extends DataObject> { 
    public getData(): Array<T> { 
    return <T[]> DataProvider.getTableData(T); 
    } 
} 

私はを取得します。名前 'T'が見つかりません getTableDataに渡すTパラメータのエラーです。 getTableDataはどのように呼び出す必要がありますか?

更新: @Paleoの助けを借りて、私はこの思い付いた:私はそれがためにViewModelになりたいという class SpeakerViewModel extends ViewModelBase<Speaker> { ... } :事は、私はすでに言われているが、ということである

export class ViewModelBase<T extends DataObject> { 

    constructor(private dataObjectClass: { new(): T}){} 

    public getTableData(): Array<T> { 
    return <T[]> DataProvider.getTableData<T>(this.dataObjectClass); 
    } 
} 

Speaker私はまだインスタンス化のようSpeakerViewModelあります

let vm = new SpeakerViewModel(Speaker);

を210

ですが、私はすでにそれが約Speakerであると言いました。私はまだこれを完全に理解していないと思う。

+0

内部から呼び出された方法を参照してくださいT 'どこにも定義されていません。 – Paleo

+0

_ "私はそれをSpeakerのViewModelにして欲しいです。私はまだSpeakerViewModelをインスタンス化しています:' let vm = new SpeakerViewModel(Speaker); '" _すみません、私は混乱しています。あなたはそれを言い換えることができますか?省略したいコードは何ですか? –

答えて

2

ジェネリックはメタデータです。関数を呼び出すときにパラメータとして使用することはできません。たぶん、あなたはこのようなものが必要です。

export class ViewModelBase<T extends DataObject> { 
    constructor(private Cl: {new(): T}) { 
    } 
    public getData(): Array<T> { 
    return DataProvider.getTableData<T>(this.Cl); 
    } 
} 
+1

ほとんどあなたのコメントは、私が実際に必要としていたもの、つまりコンストラクタ(プライベートCl:{new():T})... 'ありがとう! –

+0

@BroncoOostermeyer OK。私は将来の読者のためのコードを修正するために編集しました。 – Paleo

0

を多分これは役立つだろう:

export abstract class BaseEntity { 
    public static from<T extends BaseEntity>(c: new() => T, data: any): T { 
    return Object.assign(new c(), data) 
    } 
    public static first<T extends BaseEntity>(c: new() => T, data) { 
    if (data.rows.length > 0) { 
     let item = data.rows.item(0); 
     return BaseEntity.from(c, item); 
    } 
    return null; 
    } 

} 

を使用すると、基本クラス上またはそのサブクラスのメソッドを呼び出すことができますので、このクラスには、他の人によって拡張することができます。例えば

return Product.first(Product, data); 

または:

return BaseEntity.first(Product, data); 

from()方法が `DataProvider.getTableData(T)` `パラメータでfirst()

関連する問題