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

如何在TypeScript中类型安全地封装import()函数?

实现类型安全的懒加载模块封装函数

核心实现方案

利用TypeScript泛型结合typeof import()语法,直接获取目标模块的类型信息,同时在封装函数中执行自定义的标准操作:

// 泛型函数,T代表目标模块的类型
async function loadAndProcessModule<T>(modulePath: string): Promise<T> {
  // 执行懒加载并断言为目标类型
  const module = await import(modulePath) as T;

  // 在这里插入你的标准操作,比如日志、初始化检查、权限验证等
  console.log(`完成模块加载与处理: ${modulePath}`);
  // 示例:自动调用模块的init方法(如果存在)
  if (typeof (module as unknown as { init?: () => void }).init === 'function') {
    (module as unknown as { init?: () => void }).init();
  }

  // 返回强类型的模块对象
  return module;
}

类型安全的调用方式

调用时通过typeof import('模块路径')指定泛型参数,编译器会自动识别模块的导出成员:

// 直接指定模块类型
const module = await loadAndProcessModule<typeof import('@my-app/a/b')>('@my-app/a/b');
module.doSomething(); // 类型安全,支持自动补全与编译检查

// 也可以提前定义类型别名简化调用
type MyModule = typeof import('@my-app/a/b');
const module = await loadAndProcessModule<MyModule>('@my-app/a/b');

扩展:给模块添加额外属性

如果需要在标准操作后给模块附加自定义属性,可通过交叉类型扩展返回值类型:

async function loadAndProcessModule<T>(modulePath: string): Promise<T & { loadTime: number }> {
  const startTime = Date.now();
  const module = await import(modulePath) as T;

  // 标准操作逻辑
  console.log(`模块加载耗时: ${Date.now() - startTime}ms`);

  // 返回带额外属性的模块对象
  return {
    ...module,
    loadTime: Date.now() - startTime
  };
}

// 调用时可直接访问新增的loadTime属性
const module = await loadAndProcessModule<typeof import('@my-app/a/b')>('@my-app/a/b');
console.log(module.loadTime);
module.doSomething();

内容的提问来源于stack exchange,提问作者F-H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:52:11