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)