如何在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
相关产品推荐
相关产品推荐

