如何在不诉诸“ any”的情况下键入此函数

时间:2019-08-03 01:15:37

标签: typescript

我有一个函数,该函数接受一个对象和两个字符串,并使用字符串返回一个带类型的对象的数组,以从提供的对象中选择两个属性。

我的编译器警告元素隐式地具有'any'类型,因为类型'{}'没有索引签名。对于map函数中的两行。

export interface SelectOption {
  value: string;
  label: string;
}

/**
 * Map an array of objects to an array of objects compatible with select drop downs
 * specifying the keys to be used for the value and the label
 * @param items the object to map from
 * @param valueField The field in the object containing the value
 * @param labelField The field in the object containing the label
 */
export const mapObjectsToSelectOptions = (
  items: object[],
  valueField: string,
  labelField: string,
): SelectOption[] => {
  return items
    .map(o => ({
      value: o[valueField],
      label: o[labelField],
    }));
};

在Typescript中是否有解决方法?我尝试过为items参数创建一种类型,如下所示:

interface ObjectBase {
  [key: string]: string;
}

但是,当然,提供的对象可能没有这种类型,因此在调用函数时出现错误。我能以某种方式使用通用吗?

1 个答案:

答案 0 :(得分:1)

您需要使mapObjectsToSelectOptions具有3个类型参数作为泛型:一个用于确切的对象类型T,另外两个用于两个字段名称:用于值和标签的{{1} }和VF。然后,编译器可以将值类型推断为LF,将标签类型推断为T[VF]

T[LF]