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

无法在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:03