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?
Use the keyof typeof syntax to create a type from an object's keys, e.g. type Keys = keyof typeof person . The keyof typeof syntax returns a type that represents all of the object's keys as strings.
Use Map type and new keyword to create a map in TypeScript. let myMap = new Map<string, number>(); To create a Map with initial key-value pairs, pass the key-value pairs as an array to the Map constructor.
To define an object of objects type in TypeScript, we can use index signatures with the type set to the type for the value object. const data: { [name: string]: DataModel } = { //... }; to create a data variable of type { [name: string]: DataModel } where DataModel is an object type.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With