TypeScript:将通用类型作为参数传递给通用类

Bro*_*yer 5 generics typescript

TypeScript: 我在DataProvider类中有一个带有方法getTableData的方法:

public static getTableData<T extends DataObject>(type: { new(): T}): Array<T> { ... }
Run Code Online (Sandbox Code Playgroud)

当我编码时,这完美地工作:

let speakers = DataProvider.getTableData(Speaker);  // where Speaker is a class
Run Code Online (Sandbox Code Playgroud)

现在我想从泛型类中调用它:

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

现在,对于传递给getTableData的T参数,我收到一个找不到名称'T'的错误。应该如何调用getTableData?

更新:在@Paleo的帮助下,我想到了这个:

export class ViewModelBase<T extends DataObject> {   

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

  public getTableData(): Array<T> {
    return <T[]> DataProvider.getTableData<T>(this.dataObjectClass);
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,尽管我已经讲过: class SpeakerViewModel extends ViewModelBase<Speaker> { ... } 我希望它成为ViewModel,因为Speaker我仍然具有实例化之SpeakerViewModel类的东西:

let vm = new SpeakerViewModel(Speaker);

尽管我已经告诉过这一切了Speaker。我想我还是不太了解。

Pal*_*leo 6

泛型只是元数据。调用函数时它们不能用作参数。也许你需要这样的东西:

export class ViewModelBase<T extends DataObject> {
  constructor(private Cl: {new(): T}) {
  }
  public getData(): Array<T> {
    return DataProvider.getTableData<T>(this.Cl);
  }
}
Run Code Online (Sandbox Code Playgroud)