ts-node 执行带有模块导入和模块定义的打字稿

Posted

技术标签:

【中文标题】ts-node 执行带有模块导入和模块定义的打字稿【英文标题】:ts-node execute typescript with module import and module defined 【发布时间】:2020-12-06 07:01:35 【问题描述】:

我尝试通过 typescript 初始化数据库。

我的 ts 是这样的:

import  User, UserRole  from '../entity/User';
import crypto from 'crypto';
import dbManager, pwhash  from '..';

async function inituser() 

    const user = new User();
    user.email = 'sheng.lu@mq.edu.au';
    user.own_organization = []
    user.salt = crypto.randomBytes(16).toString('hex');
    user.password = pwhash("password", user.salt);
    user.role = UserRole.admin;
    await dbManager.save(user);
    const duser = await dbManager.findOne(User);
    return duser;

const duser = inituser();

console.log("Loaded users: ", duser);

当我尝试通过 ts-node 运行脚本时:

npx ts-node db/initializers/inituser.ts

有错误:

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1167:16)
    at Module._compile (internal/modules/cjs/loader.js:1215:27)
    at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:858:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1272:10)
    at Object.require.extensions.<computed> [as .ts] (/usr/lib/node_modules/ts-node/src/index.ts:861:12)
    at Module.load (internal/modules/cjs/loader.js:1100:32)
    at Function.Module._load (internal/modules/cjs/loader.js:962:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at main (/usr/lib/node_modules/ts-node/src/bin.ts:227:14)
    at Object.<anonymous> (/usr/lib/node_modules/ts-node/src/bin.ts:513:3)
root@MEDAIHILW237:/mnt/c/workgit/projeny# ts-node db/initializers/inituser.ts
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /mnt/c/workgit/projeny/db/initializers/inituser.ts
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
    at Loader.getFormat (internal/modules/esm/loader.js:101:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:230:31)
    at Loader.import (internal/modules/esm/loader.js:164:17)
    at Object.loadESM (internal/process/esm_loader.js:68:5)
root@MEDAIHILW237:/mnt/c/workgit/projeny# ts-node db/initializers/inituser
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /mnt/c/workgit/projeny/db/initializers/inituser.ts
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
    at Loader.getFormat (internal/modules/esm/loader.js:101:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:230:31)
    at Loader.import (internal/modules/esm/loader.js:164:17)
    at Object.loadESM (internal/process/esm_loader.js:68:5)

我在 package.json 文件中添加了 "type": "module"。


  "name": "typescript-test",
  "version": "1.0.0",
  "type": "module",
...

为了克服错误

(node:3854) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)

【问题讨论】:

【参考方案1】:

错误Warning: To load an ES module, set "type": "module" in the package.json or是由ts-node中的以下Bug引起的:https://github.com/TypeStrong/ts-node/issues/935

Bug 已关闭,有解决方案,但仍处于开放状态:https://github.com/TypeStrong/ts-node/issues/1007

package.json 中的"type": "module" 不需要。

tsconfig.json 中,我使用"module": "commonjs" 而不是"module": "es6",

我注意到这是技术债务,等待 ts-node 问题 #1007 得到解决。

【讨论】:

相关问题:***.com/questions/62096269/…

以上是关于ts-node 执行带有模块导入和模块定义的打字稿的主要内容,如果未能解决你的问题,请参考以下文章

带有打字稿的角度材料设计

Jest,ts-jest,带有 ES 模块导入的打字稿:找不到模块

为啥在带有 http 承诺的打字稿模块中未定义“this”

使用带有打字稿的 eslint - 无法解析模块的路径

打字稿导入模块作为变量不起作用

打字稿模块分辨率