运行typeorm migration:run时自定义扩展方法无法识别如何解决
TypeORM运行迁移时自定义Number扩展方法加载失败问题解决
问题表现
执行TypeORM数据库迁移命令时抛出TS类型错误:
error TS2339: Property 'toMoney' does not exist on type 'number'.
toMoney是自定义挂载到Number原型上的扩展方法,在项目普通业务代码中调用无异常,扩展方法的定义代码如下:
export { }; declare global { export interface Number { round(this: number, decimalPlaces: number): number; toMoney(this: number): number; toPercentage(this: number, decimalPlaces: number): number; } } Number.prototype.toMoney = function (this: number): number { if (!this) return 0; return this.round(2); };
当前package.json中配置的TypeORM迁移执行脚本如下:
"typeorm": "ts-node --project ./tsconfig.json -r tsconfig-paths/register ./node_modules/typeorm/cli.js"
执行npm run typeorm命令触发迁移流程时,就会复现上述类型报错。
根因
ts-node启动TypeORM CLI进程时,仅会加载执行链路中显式import/require的文件,存放全局原型扩展的文件没有被主动引入,对应的TS全局类型声明、运行时原型挂载逻辑都没有被加载,最终触发属性不存在的类型错误。
修复方案
- 先确认存放全局Number扩展方法的文件实际路径,示例路径为
src/common/extensions/number.extension.ts - 修改package.json中的typeorm脚本,通过ts-node的
-r(require)参数主动引入该扩展文件,修改后的脚本如下:
"typeorm": "ts-node --project ./tsconfig.json -r tsconfig-paths/register -r ./src/common/extensions/number.extension.ts ./node_modules/typeorm/cli.js"
- 校验根目录下
tsconfig.json的include配置,确保扩展文件所在目录被TS扫描范围覆盖,参考配置:
{ "compilerOptions": { // 保留原有配置项即可 }, "include": ["src/**/*"] }
如果扩展文件内部依赖了配置了路径别名的模块,脚本中已经引入的tsconfig-paths/register会自动处理路径映射,无需额外配置。
内容的提问来源于stack exchange,提问作者Richard Willian
相关产品推荐
相关产品推荐

