如何正确使用泛型?

时间:2019-01-19 10:26:05

标签: 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 interface ButtonSelectControlData<T> extends ControlData<T> {
  query: string;
}

export interface RoutesAddCityData extends FormData {
  cityId: ButtonSelectControlData<number>;
  routeId: ControlData<number>;
}

当我使用FormResult时:

(data: FormResult<RoutesAddCityData>) => {
  // ...
}

按预期,我在IDE中看到data.cityId的类型为ButtonSelectControlData<number>,而data.routeId的类型为ControlData<number>。 但我想在两种情况下都看到类型编号。有可能吗?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望FormResult类型从ButtonSelectControlDataControlData中提取基础类型参数。如果是这样,那么一种可能的解决方案是创建一个条件类型

type FormResult<T> = {
  [K in keyof T]: T[K] extends ControlData<infer U>
    ? U
    : never         
}