导入models目录下TypeScript文件报错:找不到指定模块
导入TypeORM实体模块失败的排查与解决
我在./models目录下的多个.ts文件中定义了TypeORM实体,在应用中导入使用时出现模块找不到的错误。
导入代码示例
import { DataSource } from "typeorm"; import { User } from "../models/User"; import { Company } from "../models/Company"; import { CompanyUser } from "../models/CompanyUser"; const initDB = () => { const AppDataSource = new DataSource({ type: "postgres", host: process.env.BACKEND_URL, port: process.env.DB_PORT as unknown as number, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [User, Company, CompanyUser], synchronize: true, logging: true, }); AppDataSource.initialize() .then(() => { console.log("Connected to the DB"); }) .catch((error) => { console.log("Failed to connect to the DB: ", error); }); }; export { initDB };
编译错误信息
CustomError: Cannot find module 'C:\Users\Yu\Desktop\Projects\keytest\keytest-backend\models\User' imported from C:\Users\Yu\Desktop\Projects\keytest\keytest-backend\utils\database.ts
当前tsconfig.json配置
{ "compilerOptions": { "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "module": "ES6", /* Specify what module code is generated. */ "outDir": "./dist", /* Specify an output folder for all emitted files. */ "moduleResolution": "node", "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ "strict": true, /* Enable all strict type-checking options. */ "skipLibCheck": true, /* Skip type checking all .d.ts files. */ "emitDecoratorMetadata": true, "experimentalDecorators": true, "strictPropertyInitialization": false, }, "ts-node": { "esm": true } }
解决方案
检查路径与大小写一致性
Windows文件系统默认不区分大小写,但forceConsistentCasingInFileNames设为true会强制校验导入路径与实际文件的大小写是否完全匹配。确认models目录下的文件名(比如是User.ts还是user.ts)和导入语句中的拼写完全一致,同时检查路径层级是否正确。添加ES模块导入后缀
由于配置了"module": "ES6"和ts-node的esm: true,ES模块导入需要明确文件后缀。修改导入语句,添加.ts后缀:import { User } from "../models/User.ts"; import { Company } from "../models/Company.ts"; import { CompanyUser } from "../models/CompanyUser.ts";配置baseUrl与paths简化导入
在tsconfig.json的compilerOptions中添加以下配置,避免相对路径出错:"baseUrl": "./", "paths": { "@models/*": ["models/*"] }之后导入语句可改为:
import { User } from "@models/User";若使用ts-node,需额外安装
tsconfig-paths,并在启动脚本中配置加载路径映射。确认文件存在与输出目录
检查报错路径中的User.ts文件是否真实存在,未被误删或移动。同时,由于配置了outDir: "./dist",编译后的文件会输出到dist目录,运行时需确保指向编译后的文件而非源码文件。调整ES模块兼容配置
在package.json中添加"type": "module",同时将tsconfig.json中的module改为ESNext或NodeNext,提升ES模块的兼容性。
内容的提问来源于stack exchange,提问作者U. Watt
相关产品推荐
相关产品推荐

