Typescript: How to map object to type?
13,281
You need to pass the type constructor to the method. Typescript erases generics at runtime to T
is not known at runtime. Also I would tighten values
a bti to only allow memebers of T
to be passed in. This can be done with 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;
}
Usage:
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)
Comments
-
sandrooco almost 2 years
Assume that I have an object containing some data. I want to build a generic mapper (only a function respectively - I don't want to instantiate a new class all the time) for all types to use like this:
this.responseMapper.map<CommentDTO>(data);
It should simply take all properties from the given type and map the data to it. What I tried so far:
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();
will throw an error:'T' only refers to a type, but is being used as a value here.
What's the correct way to do this?