TypeScript普通类转泛型类报T仅为类型却被用作值错误
报错原因
TypeScript 的泛型参数属于编译期类型标注,不会被编译到最终运行的 JavaScript 代码中,编译结束后所有泛型相关标记都会被完全擦除,运行阶段不存在名为T的实体值。plainToClass方法的第一个参数要求传入运行时可访问的类构造函数值(比如初始实现里传入的UserDto就是实际存在的构造函数值),直接把仅存在于类型层面的T当作值传入函数,就会触发T only refers to a type, but is being used as a value here报错。
正确实现方案
泛型仅负责编译期的类型校验,需要额外传入一个运行时可访问的类构造函数参数供plainToClass实际调用,同时将泛型和这个构造函数参数绑定,就能保留完整的类型推导能力。
实现代码如下:
import {plainToClass} from "class-transformer"; import UserDto from "../../auth/dto/user.dto"; class ConvertJson { /** * 通用JSON转类实例方法 * @param data 待转换的普通JSON对象 * @param clazz 目标类构造函数,为运行时可访问的实际值 * @returns 目标类的实例 */ transform<T>(data: unknown, clazz: new () => T): T { return plainToClass(clazz, data); } } // 使用示例 const converter = new ConvertJson(); // 传入实际的UserDto构造函数,TS会自动推导返回值类型为UserDto const userInstance = converter.transform(/* 传入待转换的JSON源数据 */, UserDto);
代码中new () => T是类构造函数的类型约束,用来保证传入的第二个参数是可通过new关键字实例化的类,同时和泛型T绑定后,不需要手动指定泛型参数,TypeScript 会根据传入的类自动推导返回值类型,同时满足运行时转换逻辑和编译期类型校验的需求。
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

