Typescript参数-对象的通用数组和对象键的数组(部分)

时间:2019-05-28 12:42:16

标签: arrays typescript typescript-generics keyof

我想拥有一个接受对象数组和一些对象键数组的方法。该方法将返回一个对象值数组,但仅包含选定键的数组。

数据:

pip install --trusted-host pypi.python.org pytest-xdist
pip install --trusted-host pypi.python.org --upgrade pip

字段:

[
  {"firstName": "Jane", "lastName": "Doe"},
  {"firstName": "John", "lastName": "Doe"}
]

结果:

["firstName"]

现在,我有一个可以提供所需结果的函数,但是我不确定如何更好地处理类型。

[["Jane"], ["John"]]

我尝试了下一个代码段的一些变体,但出现错误。

mapToCsvData: (data: { [key: string]: any }[], fields: string[]) => {
  return data.map((item: any) => {
    return fields.map(field => item[field]);
  });
}
mapToCsvData: <T extends object>(data: T[], fields: keyof T[]) => {

1 个答案:

答案 0 :(得分:0)

您将需要一个额外的类型参数来捕获传入的键的实际元组。您可以将其映射到T中的相应属性类型。一切都很顺利:

type MapKeyTupleToProps<T, P extends [keyof T] | Array<keyof T>> = {
    [K in keyof P]: P[K] extends keyof T ? T[P[K]] : never
}
const m = {
    mapToCsvData: <T, P extends [keyof T] | Array<keyof T>>(data: T[], fields: P): MapKeyTupleToProps<T, P> => {
        return data.map((item: any) => {
            return fields.map(field => item[field]);
        }) as any;
    }
}

const data = [
    {"firstName": "Jane", "lastName": "Doe", age: 0},
    {"firstName": "John", "lastName": "Doe", age: 0}
]

let r = m.mapToCsvData(data, ["firstName", "lastName"]) // [string, string]
let r2 = m.mapToCsvData(data, ["firstName", "age"]) //[string, number]