TypeScript泛型作构造方法传参报'T仅为类型被用作值'错误如何修复
TypeScript 泛型"仅作为类型被引用却被当作值使用"错误修复
错误根因
TypeScript 的泛型参数属于纯类型层面的语法,编译为 JavaScript 后会被完全擦除,不存在对应的运行时实体。原代码中直接将泛型参数T作为值赋值给constructorMethod属性,在运行时根本找不到对应的T值,因此编译器抛出'T' only refers to a type, but is being used as a value here错误。
正确实现
泛型只负责类型约束和类型推导,所有运行时需要用到的值(比如这里的类构造器)必须通过函数实参显式传入,修改后的代码如下:
- 泛型函数定义:
function buildY<T>(ctor: new () => T) { return doSomthing({ constructorMethod: ctor }); }
这里泛型参数T用于表示构造器对应的实例类型,入参ctor约束为无参的类构造器,返回值类型会由TS自动推导。
- 函数调用方式:
import { ClassX } from './classX'; // 不需要手动传入泛型参数,TS会根据传入的ClassX自动推导T的类型 const classYInstance = buildY(ClassX);
补充说明
原写法的核心问题是混淆了TS的类型空间和值空间:类(比如ClassX)比较特殊,它同时存在于类型空间(代表实例类型)和值空间(代表构造器本身),但泛型参数T只存在于类型空间,永远不能当作值使用。所有需要在运行时访问的内容,都必须通过JS的参数、变量等传值机制传递,不能依赖泛型。
内容的提问来源于stack exchange,提问作者mehran
相关产品推荐
相关产品推荐

