gpt4 book ai didi

javascript - 来自枚举的条件 Typescript 函数类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:20 25 4
gpt4 key购买 nike

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

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

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

export interface Vehicle {
model: string;
year?: string;
}

DatabaseModel 接口(interface)链接模型类型名称和相关数据:

export interface DatabaseModel {
modelType: any;
data: any;
}

此类型将接口(interface)映射到特定枚举。我不确定如何准确使用它,但我认为类型检查需要它才能正常工作。

export type ModelInterfaceMap = {
Person: Person;
Vehicle: Vehicle;
}

我创建了一个函数,它创建了一个 DatabaseModel,如下所示:

export function create(modelType: Models, data ): DatabaseModel {
return {
modelType,
data,
};
}

我的问题是,如何将类型添加到上面的代码,以便我可以调用创建函数并在第一个 modelType 参数中仅引用一次模型类型,并且仍然可以获得类型检查数据的所有好处反对它的关联模型?

这应该通过类型检查

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

这应该无法通过类型检查,因为 Person 接口(interface)没有年份

var newPersonFail = create(Models.Person, { firstname: 'John', lastname: 'Doe', year: '2018' });

我试过像这样使用通用类型,但这需要写两次模型类型;一次在通用类型中,一次在传递模型类型时。我想避免必须指定 modelType 两次。

export function create<T>(modelType: Models, data : <T> ): DatabaseModel<T> {...}

最佳答案

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

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

关于javascript - 来自枚举的条件 Typescript 函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54070590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com