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)
Share:
13,281
sandrooco
Author by

sandrooco

Creating cool stuff at indigo online AG.

Updated on June 04, 2022

Comments

  • sandrooco
    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?