Typescript : SyntaxError: Unexpected token 'export'

Typescript : SyntaxError: Unexpected token 'export'

在我的 React 项目中,我需要在 3 个打字稿项目之间共享模型(在我的例子中是打字稿接口)。所以我选择了 bit.env 并将我所有的模型导入 https://bit.dev/model/index/~code 并且一切都很好。

然后我需要验证模型中的字段,所以我将实用函数添加到 https://bit.dev/model/index/~code#util.ts 并将其部署到 bit.env

当我尝试在我的项目 #2(我保留 firebase 云函数的地方)中使用这个辅助函数时,我开始遇到以下错误。

/Users/vinoth.gopu/Documents/mine/oss/Cloud/functions/node_modules/@bit/model.index/dist/index.js:1
export * from './admin';
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1101:16)
    at Module._compile (internal/modules/cjs/loader.js:1149:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)

My code in project #2

export const placeOrder = functions
    .runWith({
        memory:'256MB'
    })
    .region(cloudConfig.firebase.region)
    .firestore
    .document('Orders/{OrderId}')
    .onCreate((snap, context) => {
        const orderDetails = snap.data() as UserOrders;

        try {
            //check if all fields of interface implemented
            if(isOrder(orderDetails)) { // PROBLEM HERE
                 //do something
            }

正如上面代码中所指出的,我可以使用该模型项目中的所有接口,但辅助函数会抛出错误消息。

我参考了这些文章和链接

  1. Getting Unexpected Token Export
  2. https://medium.com/the-node-js-collection/an-update-on-es6-modules-in-node-js-42c958b890c

但其中 none 似乎有效(而且我有点困惑哪个项目需要转译共享模型或项目 #2 在我的情况下?)。我可以理解这是节点的一些问题,它无法识别 ES6 模块并且需要某种中间转换。但我想知道所有具有类似 export 语句的接口如何工作得很好。我想了解我在这里缺少什么。

NodeJS 默认使用 CommonJS 方式加载包。使用较新版本的 NodeJS,您可以使用 .mjs 文件或告诉引擎项目是 a module-based project.

来获得 JavaScript 的模块功能

我不知道 FireBase 是否使用最新的 Node 版本,但这至少应该可以解释为什么您会看到该错误。在 NodeJS 已经开始在 CommonJS 中包装东西之后很久,JS 就获得了对 Export 的支持,这就是为什么它很难实现。遗留支持几乎总是痛苦的。

您可以通过更改为 CommonJS 或按照链接的 NodeJS ESM 页面中概述的步骤来解决此问题。

至于为什么导出的函数需要这个,导出的接口不需要,是因为从TS编译成JS的接口是……没什么。完全没有。 JS 没有类型系统,因此当 TS 被编译时,任何不需要的东西都会被解析为从编译到 JS 目标中排除。

看来答案在bit.dev

之内
"bit": {
    "env": {
      "compiler": {
        "bit.envs/compilers/react-typescript@3.1.52": {
          "rawConfig": {
            "tsconfig": {
              "compilerOptions": {
                "target": "ES5",
                "module": "CommonJS"
              }
            }
          }
        }
      }
    },
    "componentsDefaultDirectory": "src/{name}",
    "packageManager": "npm"
  },

通过处理转译解决了我的问题。