TypeScript:将泛型类型作为泛型类中的参数传递

时间:2016-05-27 11:29:17

标签: generics typescript

打字稿: 我在DataProvider类中有一个方法getTableData:

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);
  }
}

现在我收到一个无法找到名称&#39; <&#39; 错误,因为我传递给getTableData的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);
  }
}
事情是,虽然我已经告诉过: class SpeakerViewModel extends ViewModelBase<Speaker> { ... } 我希望它是Speaker的ViewModel我仍然像SpeakerViewModel那样实例化:

let vm = new SpeakerViewModel(Speaker);

虽然我已经告诉它完全是Speaker。我想我还是不完全理解这一点。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

也许这会有所帮助:

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()

内部调用first()方法

答案 2 :(得分:0)

如何定义基本类型并对其进行扩展?然后,您的函数可以期待基本类型,并且可以使用扩展类型来调用它。例如:

export interface BaseData {
  key: object
}

然后:

import { BaseData } from 'baseDataFile'

export interface DerivedData extends BaseData {
  key: someObjectType
}

现在:

import { BaseData } from 'baseDataFile'

export const someFunc = (props: BaseData) => {
    // do some stuff
    return something 
}

最后:

import { DerivedData } from 'derivedDataFile'

const myData: DerivedData = something as DerivedData
const myNewData = someFunc(myData)