TypeScript用fs批量导入100个.ts文件是否可行?如何追踪类型?
问题解答
1. 方案可行性判断
你给出的基于fs.readdirSync批量加载同目录.ts文件的方案在Node.js环境下是可行的,仅需要注意两个前置条件:
- 仅适用于CommonJS模块化规范的项目,如果是ESM规范的项目不能直接使用
require,需要替换为import()动态导入语法 - 现有过滤规则可以额外补充排除
.d.ts声明文件的逻辑,避免误加载不需要的类型文件
2. 原代码修正
你提供的参考代码末尾缺失两个闭合括号,修正后的可运行版本如下:
import { readdirSync } from 'fs'; import path from 'path'; const basename = path.basename(__filename); const temp: Record<string, any> = {}; readdirSync(__dirname) .filter((file: string) => file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.ts' && !file.endsWith('.d.ts') // 补充排除声明文件的逻辑 ) .forEach((file: string) => { temp[file.slice(0, -3)] = require(path.join(__dirname, file)); });
3. 导入内容的类型追踪方案
动态加载的内容TS默认无法做静态类型推断,你可以根据场景选择以下两种方案实现类型追踪:
- 方案一:统一导出约定 + 类型约束
如果所有被加载的.ts文件都遵循统一的导出规范,比如每个文件都默认导出相同结构的对象,可以先定义统一的类型接口,再给temp变量加上类型声明即可:
// 示例:定义所有被加载文件的统一导出结构 interface IModuleExport { name: string; run: () => Promise<void>; // 补充其他通用属性/方法 } // 给temp加上类型后,调用内部属性时会自动触发类型检查和提示 const temp: Record<string, IModuleExport> = {};
- 方案二:通配符静态导入(推荐非动态场景)
如果不需要完全运行时动态加载、只是不想手动写100个import语句,可以用TS支持的通配符导入,配合构建工具(Webpack/Vite/tsup都支持)可以自动推导所有匹配模块的类型,完全静态无需额外维护类型定义:
// 示例:Vite环境下的通配符导入,自动加载所有.ts文件的默认导出 const modules = import.meta.glob<IModuleExport>('./*.ts', { eager: true, import: 'default' }); // 生成和之前temp结构完全一致的对象,自带完整类型提示 const temp = Object.fromEntries( Object.entries(modules).map(([filePath, module]) => [filePath.slice(2, -3), module]) );
内容的提问来源于stack exchange,提问作者Nakul Warrier
相关产品推荐
相关产品推荐

