Typescript SyntaxError: Cannot use import statement outside a module (side file containing functions)

Typescript SyntaxError: Cannot use import statement outside a module (side file containing functions)

我正在使用 mineflayer library. After a bit of work I decided to make code readable and reusable (image of file organisation) 创建一个 minecraft 机器人,并且也开始使用打字稿。我已经阅读了很多堆栈线程和其他文章,因为这个问题很流行。但是,在尝试了所有这些之后,问题仍然存在。

编辑,重要变化:

我试过用 tsc bot.ts --resolveJsonModulenode bot.js 编译它。事实证明它工作得很好,所以现在问题缩小到配置 WebStorm 运行ning 选项。

这是我已经完成的

运行整个代码

因为我使用的是 WebStorm,这就是我在 运行ning 选项中的内容:image(只是为了澄清我没有 运行 来自终端的代码)

在简化环境中重现问题

bot.ts

import {util} from "./utils/util" // error is thrown right away, so other lines are irrelevant I guess

const mineflayer = require('mineflayer')
const bot = mineflayer.createBot()

util.ts

import * as config from "../config/config_main.json"
export module util {
    export function sleep (time) {
        return new Promise((resolve) => setTimeout(resolve, time));
    }

    export function random(list) {
        if (list[0] === list[1]) return list[0];
        return Math.floor(Math.random() * (list[1] - list[0]))  + list[0];
    }
}

config_main.json

{
  "bot": {
    "username": "username",
    "password": "password"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true,                             
    "forceConsistentCasingInFileNames": true,
    "strict": false,                                      
    "skipLibCheck": true                           
  }
}

package.json

{
  "type": "module",
  "name": "mcbot",
  "main": "bot.js",
  "scripts": {
    "test": "None"
  }
}

相关话题

import { parse } from 'node-html-parser';
parse = require('node-html-parser');

但是 IDE 给我 TS2632: Cannot assign to 'util' because it is an import. 错误。

首先,从 package.json 中删除 type:module。然后从 tsconfig.json 中删除 module:commonjs。使用 export default function util () {} 语法。如果您已完成前两个步骤,命名导出也将适用于本地文件。

原因

你混合了 es6 和 commonjs。 module:commonjs 强制它是 commonjs 而 esModuleInterop 强制它是 es6。 type:module显示 es6 错误并强制写入文件扩展名,请先将其删除

警告

命名导入不适用于 npm 包。就像你不能使用

import { something } from "some-package";

而是导入默认的,然后访问命名的。

import defaultExport from "some-package";

const something = defaultExport.something

通过更改修复:

import {util} from "./utils/util"

收件人:

const util = require('./utils/util')
// or
const { sleep, random, eatAny, clickItem, lookAtEntity} = require('./utils/util')

毕竟我不知道为什么用 tsc 编译一直运行良好,而 webstorm 抛出错误。我刚刚将 import ES6 语法更改为 require() CommonJS.