首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Typescript泛型方法

Typescript泛型方法
EN

Stack Overflow用户
提问于 2019-07-30 21:11:31
回答 1查看 40关注 0票数 0

我有一个方法,我想在其中传递一个泛型对象数组。我还想传入要查找的对象属性。

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

我如何做到这一点,如何传入属性并从对象数组中取出它的值?

通过执行以下命令,我知道这些属性是否存在:

代码语言:javascript
运行
复制
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‘,其中包含显示和值的键值对。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-30 21:24:10

您对数组使用Object.keys看起来有点不对劲。要将一个数组转换为另一个数组,map是一个更好的选择。

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

代码语言:javascript
运行
复制
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]
  }))
}

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

代码语言:javascript
运行
复制
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
  }));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57272549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档