打字稿:SyntaxError:意外的令牌“导出”

时间:2020-05-27 19:20:24

标签: javascript node.js typescript babeljs

在我的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)

我在项目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

但是它们似乎都不起作用(我还是有些困惑,哪个项目需要移植共享模型或我的项目#2?)。我可以理解,这是节点无法识别ES6模块并需要某种中间转换的问题。但是我想知道所有带有类似export语句的接口都工作得很好。我想了解我在这里想念什么。

3 个答案:

答案 0 :(得分:1)

答案似乎在bit.dev内

    for (var i = 0; i < boxesLength; i++) {
      boxes[i].onclick = function () {
        modal.style.display = "block";
        var koko = this;
        green.onclick = function () {
          koko.style.backgroundColor = "#90EE90";
          modal.style.display = "none";
        };
      };

通过照顾移植解决了我的问题。

答案 1 :(得分:0)

NodeJS默认使用CommonJS方式加载软件包。使用新版本的NodeJS,您可以使用.mjs文件或告诉引擎项目为a module-based project来获得JavaScript的模块功能。

我不知道FireBase是否使用最新的Node版本,但这至少可以解释您为什么看到此错误。在NodeJS已经开始将内容包装在CommonJS中之后,JS就获得了对Export的支持,这就是为什么要实现这一问题。传统支持几乎总是很痛苦。

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

关于为什么导出的函数需要此功能,而不是导出的接口需要此原因,这是因为从TS编译为JS的接口没什么。从字面上看没什么。 JS没有类型系统,因此,当TS进行编译时,不需要的所有内容都被解析为从JS目标的编译中排除。

答案 2 :(得分:0)

前几天我遇到了与v3.9.x类似的问题。尝试降级到Typescript v3.8.x,并为您的项目确保运行 npm install -D typescript@3.8 ,以确保将来使用正确的版本进行构建,直到3.9版修复为止。X。我认为v3.9.x Transpiler中存在一个错误,因为它包含重新导出的接口和其他类型,这些类型在重新导出时不应包含在输出javascript中。