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)

Relaterte artikler