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

标签 arrays typescript typescript-generics keyof

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

数据:

[
  {"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[]) => {
Property 'map' does not exist on type 'number'.

最佳答案

您将需要一个额外的类型参数来捕获传入的键的实际元组。您可以将此元组映射到 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]

关于arrays - Typescript 参数 - 通用对象数组和对象键数组(部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342559/

相关文章:

arrays - Kotlin 数组类型和类字面量

javascript - 将 JavaScript 函数重写为类方法? ( typescript 可能)

typescript - 为什么条件类型中的 "infer"会改变返回类型?

Typescript - 迭代以解析/细化对象

typescript - 将函数返回值定义为读取对象中路径的类型

计算多维数组第一维

Javascript - 根据数组值选中/取消选中复选框

arrays - 数组是如何存储在内存中的?

typescript - Angular CLI 编译错误;预期有 1 个参数,但得到 0 个

javascript - 从 Angular 4 升级到 7 会导致一些问题