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



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

现在,我收到传递给 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);
  }
}

问题是,虽然我已经告诉过: class SpeakerViewModel extends ViewModelBase<Speaker> { ... } 我希望它是一个视图模型,Speaker我仍然有实例化SpeakerViewModel,如下所示:

let vm = new SpeakerViewModel(Speaker);

虽然我已经说过这一切都是关于Speaker.我想我仍然不完全理解这一点。

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

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

也许这会有所帮助:

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

定义基类型并扩展它怎么样?然后,您的函数可能需要基类型,您可以使用扩展类型调用它。例如:

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)

最新更新