打字稿: 我在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
。我想我还是不完全理解这一点。
答案 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)