打字稿参数 - 对象的通用数组和对象键的数组(部分)
Typescript parameters - a generic array of objects and array of object's keys (partial)
我想要一个接受对象数组和一些对象键数组的方法。该方法将 return 对象值数组的数组,但仅包含选定的键。
数据:
[
{"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]
我想要一个接受对象数组和一些对象键数组的方法。该方法将 return 对象值数组的数组,但仅包含选定的键。
数据:
[
{"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]