Typescript 如何正确使用泛型?
有一组接口:Typescript 如何正确使用泛型?,typescript,Typescript,有一组接口: export interface FormData<T extends ControlData = any> { [type: string]: T; } export type FormResult<T extends FormData> = { [type in keyof T]: T[type]; }; export interface ControlData<T = any> { value: T; } export i
export interface FormData<T extends ControlData = any> {
[type: string]: T;
}
export type FormResult<T extends FormData> = {
[type in keyof T]: T[type];
};
export interface ControlData<T = any> {
value: T;
}
export interface ButtonSelectControlData<T> extends ControlData<T> {
query: string;
}
export interface RoutesAddCityData extends FormData {
cityId: ButtonSelectControlData<number>;
routeId: ControlData<number>;
}
导出接口FormData{
[类型:字符串]:T;
}
导出类型FormResult={
[type in keyof T]:T[type];
};
导出接口控制数据{
值:T;
}
导出接口按钮SelectControlData扩展ControlData{
查询:字符串;
}
导出接口路由AddCityData扩展FormData{
cityId:按钮选择控制数据;
routeId:控制数据;
}
当我使用FormResult时:
(data: FormResult<RoutesAddCityData>) => {
// ...
}
(数据:FormResult)=>{
// ...
}
正如预期的那样,我在IDE中看到data.cityId
具有类型ButtonSelectControlData
和data.routeId
具有类型ControlData
。
但我希望看到两种情况下的类型编号。有可能吗?如果我理解正确,您希望
FormResult
类型从按钮selectcontroldata
和ControlData
提取底层类型参数。如果是这种情况,那么一种可能的解决方案是创建条件类型:
类型FormResult={
[K in keyof T]:T[K]扩展控制数据
U
:从不
}
您所说的“我想在两种情况下都看到类型编号”是什么意思?这两个对象都不是number
类型,它们只包含number
类型的成员。我需要以某种方式重写FormResult以查看数据。cityId:number
和数据。routeId:number
而不是按钮选择控制数据
。谢谢您的回答!我从未使用过inver
关键字。您的解决方案适用于两个类。但将来可能会添加另一个ControlData
或ButtonSelectControlData
的子项。我试图简化您的代码导出类型FormResult={[K in keyof T]:T[K]扩展ControlData?U:never;}是的,它会工作,因为ButtonSelectControlData
并不真正使用它的参数类型-它只将它传递给ControlData
。
type FormResult<T> = {
[K in keyof T]: T[K] extends ControlData<infer U>
? U
: never
}