我有一个用typescript编写的express服务器,它的tsconfig中有"module": "es2020"
。
我还为我的graphql API开发了另一个es2020
模块,仍然是在typescript中,这个模块使用mongoose和这样的命名导入:
import { Types } from 'mongoose'
当我用tsc
编译我的graphql模块时,一切都很好。但是运行在nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
无法处理名为导入的mongoose。
import { Types } from 'mongoose';
^^^^^
SyntaxError: Named export 'Types' not found. The requested module 'mongoose' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:
import pkg from 'mongoose';
const { Types } = pkg;
方案一
import mongoose from 'mongoose'
将Types
替换为mongoose.Types
。
但是由于tsc
可以处理名为import的mongoose,我希望也可以使ts-node能够这样做。
方案二
切换到commonjs
,我可以在我的graphql模块中保留导入/导出语法,并将其编译为cjs模块。但是我必须在express服务器中使用cjs语法,我不想这样做。
2条答案
按热度按时间z31licg01#
TL;DR
您所要做的就是从类型中删除花括号。应该可以就像这样:
但名字并不重要。
说明
import Types from 'mongoose'
可以工作,因为我们导入的是包的默认导出(这就是为什么我们使用的名称无关紧要)。然而,当你执行
import * as Types from 'mongoose
时,你告诉JS你“认真地”想要原始的一切。这意味着不是获取默认导出:你得到这个:
所以你也可以做
Types.default
,但这可能不是那么干净。🙂This StackOverflow post建议我们可以让两者都工作,但也建议这将是一个可能不应该工作的黑客解决方案😓
ojsjcaue2#
如果你在使用mono-repo时遇到这个错误,请确保你遇到问题的模块有
在
package.json
中。似乎Nodejs默认会将包视为
commonjs
,您需要显式地告诉它您的包是一个模块。