【发布时间】:2019-01-07 08:07:37
【问题描述】:
我正在创建一个数据库模式,它需要每个模型类型的字符串名称,并且我需要避免使用类。我的数据库模型由枚举和接口定义:
const enum Models {
Person = 'Person',
Vehicle = 'Vehicle',
}
export interface Person {
firstname: string;
lastname?: string;
}
export interface Vehicle {
model: string;
year?: string;
}
DatabaseModel 接口链接模型类型名称和相关数据:
export interface DatabaseModel {
modelType: any;
data: any;
}
此类型将接口映射到特定枚举。我不确定如何准确使用它,但我认为类型检查需要它才能正常工作。
export type ModelInterfaceMap = {
Person: Person;
Vehicle: Vehicle;
}
我创建了一个创建 DatabaseModel 的函数,如下所示:
export function create(modelType: Models, data ): DatabaseModel {
return {
modelType,
data,
};
}
我的问题是,如何在上面的代码中添加类型,以便我可以调用 create 函数并且只在第一个 modelType 参数中引用模型类型一次,并且仍然可以获得类型检查数据的所有好处反对它的关联模型?
这应该通过类型检查
var newPerson = create(Models.Person, { firstname: 'John', lastname: 'Doe' });
var newVehicle = create(Models.Vehicle, { model: 'Ford', year: '2018' });
这应该会导致类型检查失败,因为 Person 接口没有年份
var newPersonFail = create(Models.Person, { firstname: 'John', lastname: 'Doe', year: '2018' });
我尝试使用像这样的泛型类型,但这需要两次编写模型类型;一次是泛型类型,一次是传入模型类型。我想避免必须指定模型类型两次。
export function create<T>(modelType: Models, data : <T> ): DatabaseModel<T> {...}
【问题讨论】:
-
啊,是的,我会编辑的。
标签: javascript typescript typescript-typings