【问题标题】:typescript - get type by indexing object interface with variabletypescript - 通过使用变量索引对象接口来获取类型
【发布时间】:2020-09-02 06:35:18
【问题描述】:

您好,我想用变量索引对象接口

这是我的界面:

interface OptionsRedux {
  default_route: DefaultRoute[];
  insurance_company: InsuranceCompany[];
  marital_status: MaritalStatus[];
  reason: Reason[];
  termination_reason: TerminationReason[];
}
type optionGroupTypes = keyof OptionsRedux;

现在我的代码如下所示:

interface GetOptions {
  type: ActionTypes.getOptions,
  payload: {group: optionGroupTypes, values: OptionsRedux[optionGroupTypes]}
}
export const getOptions = (
  group: optionGroupTypes,
  values: OptionsRedux[optionGroupTypes]
): GetOptions => ({
  type: ActionTypes.getOptions,
  payload: { group, values },
});

这给了我有效载荷值的类型:

DefaultRoute[] | InsuranceCompany[] | MaritalStatus[] | Reason[] | TerminationReason[]

但我想做这样的事情:

interface GetOptions {
  type: ActionTypes.getOptions,
  payload: {group: optionGroupTypes, values: OptionsRedux[group]}
}

这让我知道该组是未定义的。

我的目标是,当我使用函数 getOption("default_route", values) 时,值必须是:

DefaultRoute[]

有什么想法吗?找不到任何可行的方法

【问题讨论】:

    标签: typescript dynamictype


    【解决方案1】:

    这是创建部分界面的正确方法

    interface IPerson {
    firstname: string,
    lastname: string,
    [key: string]: any
    }
    

    创建 IPerson 类型的对象

    const person: IPerson {
    firstname: 'John',
    lastname: 'Doe',
    phonenummber: 82184
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      您可以使用泛型来实现这一点。扩展您的示例:

      interface GetOptions<T extends optionGroupTypes> {
        type: ActionTypes.getOptions,
        payload: { group: T, values: OptionsRedux[T] }
      }
      
      export const getOptions = <T extends optionGroupTypes>(
        group: T,
        values: OptionsRedux[T]
      ): GetOptions<T> => ({
        type: ActionTypes.getOptions,
        payload: { group, values },
      });
      

      通过添加泛型类型Tgroupvalues 类型彼此保持同步。 T 是具体选择的类型,而不是所有类型的联合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 2022-12-04
        • 2016-01-18
        • 2017-06-11
        相关资源
        最近更新 更多