Typescript-parametre - en generisk array af objekter og array af objekternes nøgler (delvis)
Jeg vil gerne have en metode, der accepterer et array af objekter og et array af nogle af objekternes nøgler. Metoden vil returnere et array af arrays af objektværdier, men kun af de valgte nøgler.
data :
[
{"firstName": "Jane", "lastName": "Doe"},
{"firstName": "John", "lastName": "Doe"}
]
felter :
["firstName"]
resultat :
[["Jane"], ["John"]]
Nu har jeg en funktion, der giver det ønskede resultat, men jeg er ikke sikker på, hvordan jeg bedre håndterer typerne.
mapToCsvData: (data: { [key: string]: any }[], fields: string[]) => {
return data.map((item: any) => {
return fields.map(field => item[field]);
});
}
Jeg har prøvet nogle variationer af følgende uddrag, men jeg får en fejl.
mapToCsvData: <T extends object>(data: T[], fields: keyof T[]) => {
Property 'map' does not exist on type 'number'.
Svar #1
Du vil få brug for en ekstra typeparameter for at fange den faktiske tuple af nøgler, der bliver sendt ind. Du kan derefter kortlægge denne tuple til de tilsvarende ejendomstyper i T. Det hele hænger meget pænt sammen:
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]
