Javascript 来自枚举的条件类型脚本函数类型

Javascript 来自枚举的条件类型脚本函数类型,javascript,typescript,typescript-typings,Javascript,Typescript,Typescript Typings,我正在创建一个数据库模式,它需要每个模型类型的字符串名,并且我需要避免使用类。我的数据库模型由枚举和接口定义: const enum Models { Person = 'Person', Vehicle = 'Vehicle', } export interface Person { firstname: string; lastname?: string; } export interface Vehicle { model: string; year?: str

我正在创建一个数据库模式,它需要每个模型类型的字符串名,并且我需要避免使用类。我的数据库模型由枚举和接口定义:

const enum Models {
  Person = 'Person',
  Vehicle = 'Vehicle',
}

export interface Person {
  firstname: string;
  lastname?: string;
}

export interface Vehicle {
  model: string;
  year?: string;
}
DatabaseModel接口链接modelType名称和关联数据:

export interface DatabaseModel {
  modelType: any;
  data: any;
}
此类型将接口映射到特定枚举。我不知道如何准确地使用它,但我认为类型检查需要正确地工作

export type ModelInterfaceMap = {
  Person: Person;
  Vehicle: Vehicle;
}
我创建了一个函数,该函数创建一个数据库模型,如下所示:

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' });
我尝试使用这样的泛型类型,但这需要编写两次模型类型;一次在泛型类型中,一次在传入模型类型时。我希望避免两次指定modelType

export function create<T>(modelType: Models, data : <T> ): DatabaseModel<T> {...}
导出函数create(modelType:Models,data:):DatabaseModel{…}

您需要捕获在泛型类型参数中传递给函数的实际枚举成员(作为枚举文字类型)。有了此类型,我们可以使用它索引到
ModelInterfaceMap
,根据传入的枚举获取
数据的适当类型:

export function create<T extends Models>(modelType: T, data: ModelInterfaceMap[T]): DatabaseModel {
    return {
        modelType,
        data,
    };
}

var newPerson = create(Models.Person, { firstname: 'John', lastname: 'Doe' });
var newVehicle = create(Models.Vehicle, { model: 'Ford', year: '2018' });

var newPersonFail = create(Models.Person, { firstname: 'John', lastname: 'Doe', year: '2018' });
导出函数创建(modelType:T,data:ModelInterfaceMap[T]):数据库模型{ 返回{ 型号, 数据, }; } var newPerson=create(Models.Person,{firstname:'John',lastname:'Doe'}); var newVehicle=create(Models.Vehicle,{model:'Ford',年份:'2018'}); var newPersonFail=create(Models.Person,{firstname:'John',lastname:'Doe',year:'2018'});
Ahh是的,我会编辑它。@Chris我试试:)