2017-03-16 8 views
0

このコードは、CreateItemの呼び出しの最初のパラメーターがスコープ内の変数ではないため、コンパイルされません。汎用メソッドの型パラメーターの値の参照方法

abstract class Catalog<ItemType, IRaw> { 
    private CreateItem<ItemType, IRaw>(c: new (raw: IRaw) => ItemType, raw: IRaw): ItemType { 
     return new c(raw); 
    } 
    public ServiceUrl: string; 
    public Items: KnockoutObservableArray<ItemType> = ko.observableArray<ItemType>(); 
    public LoadState: KnockoutObservable<LoadState> = ko.observable<LoadState>(LoadState.NotStarted); 
    private loadChunk(): void { 
     var that = this; 
     if (that.LoadState() === LoadState.NotStarted) 
     that.LoadState(LoadState.Loading); 
     if (that.LoadState() === LoadState.Loading) { 
     $.get(this.ServiceUrl, that.getChunkParameters()).then((result: Array<IRaw>) => { 
      if (result.length === 0) { 
      that.LoadState(LoadState.Complete) 
      } else { 
      for (var raw of result){ 
       let foo = this.CreateItem(ItemType, raw); 
       that.Items.push(foo); 
      } 
      } 
     }); 
     } 
    } 

ジェネリックパラメータItemTypeの値に変数参照を取得するにはどうすればよいのですか?CreateInstanceに渡すことができますか?

答えて

0

できません。値としてクラスだけを使用できます。 typescriptがjavascriptにコンパイルされている場合、他の型、特にジェネリックパラメータは値ではなく、保存されません。その変数は、CreateItem()に似た値の引数として、またはCatalogクラスのプロパティとしてアクセスできるように、何らかの形で初期化する必要があります。loadChunk()に明示的に提供する必要があります。

Do Typescript generics use type erasure to implement generics?も参照してください。

+0

私は恐れていました。私は継承を悪用するために書き直していますが、作曲の柔軟性はあまりありません。ああ、ドローイングボードに戻って。 –

関連する問題