javascript - Convertiți clasa Normal în generic în TypeScript


Am o clasă pentru a obține obiecte JSON și a le converti în clasa pe care o doresc. Codul este mai jos.

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

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

când vreau să convertesc clasa într-o clasă generică

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

class ConvertJson<T> {

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

Primești această eroare

T se referă doar la un tip, dar este folosit aici ca o valoare

Răspuns #1

După ce am modificat codul, am descoperit că genericul din TypeScript este foarte diferit de C# sau alte limbaje, așa că am convertit codul astfel încât să aibă o atmosferă generică, dar nu și sintaxa.

import {plainToClass} from "class-transformer";

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

class ConvertJson {

    constructor(private dto : IClass) {
    }

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


motivul pentru care folosesc IClass în loc de any este că vreau să mă asigur că ceilalți colegi folosesc class, nu alte tipuri.

Răspunsul #2

Îmbunătățește comentariul lui Milad👇
class-transformer oferă ceva clasă generică pentru a face același lucru pe care l-a introdus el.

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

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

Versiunea mea de class-transformer este v0.5.1

✍Notă:
plainToClasss este învechit❌
Folosește plainToInstance în schimb (este același)✅