typescript - 通过使用变量索引对象接口来获取类型

Posted

技术标签:

【中文标题】typescript - 通过使用变量索引对象接口来获取类型【英文标题】:typescript - get type by indexing object interface with variable 【发布时间】: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[]

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

【问题讨论】:

【参考方案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 是具体选择的类型,而不是所有类型的联合。

【讨论】:

以上是关于typescript - 通过使用变量索引对象接口来获取类型的主要内容,如果未能解决你的问题,请参考以下文章

Typescript索引和接口继承

Typescript 从具有泛型类型的对象索引调用函数

Typescript 索引属性约束检查适用于原始类型但不适用于对象文字?

Typescript中的接口

TypeScript接口

盘点 TypeScript 的基础认识 二