javascript - Konvertera Normal-klassen till generisk i typescript


Jag har en klass för att hämta JSON-objekt och konvertera dem till den klass jag vill ha. Koden är nedan.

import {plainToClass} from "class-transformer";
import UserDto from "../../auth/dto/user.dto";

class ConvertJson {
    
    userData(data) {
        return plainToClass(UserDto, data);
    }
}

när jag vill konvertera klassen till en generisk klass

import {plainToClass} from "class-transformer";
import UserDto from "../../auth/dto/user.dto";

class ConvertJson<T> {

    userData(data) {
        return plainToClass(T, data);
    }
}

Jag får detta fel

T refererar bara till en typ, men används här som ett värde

Svar #1

Efter att ha justerat koden upptäckte jag att TypeScript-generics är väldigt olika från C# eller andra språk, så jag konverterade koden till detta så att den har en generisk känsla men inte syntaxen.

import {plainToClass} from "class-transformer";

interface IClass {
    new (...args : any[])
}

class ConvertJson {

    constructor(private dto : IClass) {
    }

    userData(data) {
        return plainToClass(this.dto, data);
    }
}


anledningen till att jag använder IClass istället för any är att jag vill säkerställa att andra teammedlemmar använder class, inte andra typer.

Svar #2

Förbättra från Milads kommentar👇
class-transformer tillhandahåller någon generisk klass för att göra samma sak som han introducerade.

import { plainToClass, ClassConstructor } from "class-transformer";

class ConvertJson {
    userData<TargetClass>(data: unknown, dtoClass: ClassConstructor<TargetClass>) {
        return plainToClass(dtoClass, data);
    }
}

Min class-transformer-version är v0.5.1

✍Notera:
plainToClasss är föråldrat❌
Använd plainToInstance istället (det är samma)✅