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         
}