You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:12:17