无法在TypeScript中调用自定义ArrayList<T>类构造器的问题求助
解决TypeScript泛型类用
module.exports导出后require无法实例化的问题 问题场景
编写泛型ArrayList<T>类后,用module.exports导出,在另一个TypeScript文件里通过require导入时,仅能声明ArrayList类型变量,无法调用构造器实例化,比如let newGraph: ArrayList<ArrayList<number>> = new ArrayList<ArrayList<number>>()会触发报错。
问题原因
用CommonJS规范的module.exports导出泛型类时,TypeScript无法自动推断该变量是带泛型的类构造器,只会将其识别为普通JavaScript值,导致实例化阶段的类型校验失败。
修复方案
方案1:改用ES模块的导出/导入(推荐)
这是TypeScript项目更适配的模块规范,能自动保留泛型类型信息:
- 修改导出文件的最后一行:
// 替换原有的 module.exports = ArrayList; export default ArrayList; - 导入文件改用
import语法:import ArrayList from "./ArrayList"; let newGraph: ArrayList<ArrayList<number>> = new ArrayList<ArrayList<number>>(); // 可正常实例化
方案2:保留CommonJS,添加类型断言
如果必须使用require,可手动给导入变量添加类型断言,明确告知TypeScript这是泛型类构造器:
// 先导入类型,再断言构造器类型 import type { ArrayList } from "./ArrayList"; const ArrayList = require("./ArrayList") as new <T>(capacity?: number) => ArrayList<T>; // 现在可正常实例化 let newGraph: ArrayList<ArrayList<number>> = new ArrayList<ArrayList<number>>();
也可以用更简洁的写法:
const ArrayList = require("./ArrayList") as typeof import("./ArrayList").default; let newGraph: ArrayList<ArrayList<number>> = new ArrayList<ArrayList<number>>();
内容的提问来源于stack exchange,提问作者slaid world
相关产品推荐
相关产品推荐

