打字稿通用方法

时间:2019-07-30 13:11:30

标签: typescript generics

我有一种方法想要传递通用对象数组。我还想传递对象属性以进行查找。

属性名称可以更改,因此我想用传入的内容来切换描述和值。

我该怎么做,如何传入属性并从对象数组中提取其值?

通过执行以下操作,我知道属性是否存在:

console.log(obj[key].hasOwnProperty(strDisplay))
console.log(obj[key].hasOwnProperty(strValue))


public Test<T>(obj: T[], strDisplay: string, strValue: string) {

    const pickList: PickListOption[] = [];

    Object.keys(obj).forEach(key => {

      const option: IPickListOption = {
        display:obj[key].description  ,
        value: obj[key].value
      };

      pickList.push(option);

    })

    return pickList;
  }

我希望能够返回具有显示和值的键值对的新列表'pickList'。

1 个答案:

答案 0 :(得分:0)

您对阵列使用Object.keys似乎有些偏离。要将数组转换为另一个数组map是更好的选择。

关于选择两个键,您将需要strDisplaystrValue作为T的值键,以便使用到对象的索引:

interface PickListOption { value: unknown, display: unknown }
function Test<T>(arr: T[], strDisplay: keyof T, strValue: keyof T) {

  return arr.map((o): PickListOption => ({
    display: o[strDisplay],
    value: o[strValue]
  }))
}

您还可以使用特殊的映射和条件类型将键限制为仅特定类型的值:

type KeysOfValueType<T, TValue> = {
  [P in keyof T] : T[P] extends TValue ? P: never
}[keyof T]

interface PickListOption { value: number, display: string }
function Test<T>(arr: T[], strDisplay: KeysOfValueType<T, string>, strValue: KeysOfValueType<T, number>) {

  return arr.map((o): PickListOption => ({
    display: o[strDisplay] as unknown as string,
    value: o[strValue] as unknown as number
  }));
}