javascript - Typescript: Hvordan kartlegge objekt til type?
Anta at jeg har et objekt som inneholder noen data. Jeg vil lage en generell mapper (kun en funksjon henholdsvis - jeg vil ikke instansiere en ny klasse hele tiden) for alle typer å bruke slik: this.responseMapper.map<CommentDTO>(data);
Det bør rett og slett ta alle egenskaper fra den gitte typen og kartlegge dataene til den. Det jeg har prøvd så langt:
public map<T>(values: any): T {
const instance = new T();
return Object.keys(instance).reduce((acc, key) => {
acc[key] = values[key];
return acc;
}, {}) as T;
}
new T(); vil gi en feil: 'T' refererer bare til en type, men blir brukt som en verdi her.
Hva er den riktige måten å gjøre dette på?
Svar #1
Du må sende typekonstruktøren til metoden. Typescript sletter generiske typer ved kjøretid, så T er ikke kjent ved kjøretid. Jeg ville også strammet inn values litt for kun å tillate at medlemmer av T kan sendes inn. Dette kan gjøres med Partial<T>
public map<T>(values: Partial<T>, ctor: new () => T): T {
const instance = new ctor();
return Object.keys(instance).reduce((acc, key) => {
acc[key] = values[key];
return acc;
}, {}) as T;
}
Bruk:
class Data {
x: number = 0; // If we don't initialize the function will not work as keys will not return x
}
mapper.map({ x: 0 }, Data)
