TypeScript/Knex:无法在模块外部使用 import 语句

Max*_*ose 12 javascript node.js typescript knex.js

我是 TypeScript 的新手,目前使用 Knex 在 PostgreSQL 数据库中构建模板表。在此文件和其他文件上,我不断遇到 TypeScript 的同一问题,代码如下:

import * as Knex from 'knex';


exports.up = async (knex: Knex): Promise<void> => {
    await knex.schema.raw(`
    CREATE TABLE test (
        test TEXT NOT NULL,
        tes2  INTEGER NOT NULL,
        PRIMARY KEY (key, website)
    ) 
`);
}


exports.down = async (knex: Knex): Promise<void> => {
    await knex.schema.dropTable('test');
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

import * as Knex from 'knex';
^^^^^^

SyntaxError: Cannot use import statement outside a module
Run Code Online (Sandbox Code Playgroud)

我也尝试过这些变体:

   import * as Knex = require('knex');
   import { * as Knex } from 'knex';
   const * = require('knex');
   const { * as Knex } = require('knex');
Run Code Online (Sandbox Code Playgroud)

但我在网上找不到任何似乎可以解决问题的解决方案。

对此的任何帮助都会很棒。

小智 13

尝试了很多方法但没有任何帮助,尝试将类型更改为模块只会让事情变得更糟。毕竟缺少的是 ts-node:

纱线添加 ts-node -D

你就完成了=]


T.J*_*der 2

您正在混合两种不同类型的模块。import/exportJavaScript 标准模块语法(“ESM”代表“ECMAScript 模块”),但分配给属性exportsCommonJS 模块语法(又名“CJS”)。您需要使用其中之一,如果您使用 ESM,则需要通过使用"type": "module"inpackage.json或使用.mjs文件扩展名 \xc2\xa0\xe2\x80\x94 来告诉 Node.js,或者,因为您\'在使用 TypeScript 时,您可能需要"module": "ES2020"或类似的(更多此处)。

\n

该错误告诉我们 Node.js 和/或 TypeScript 认为您正在使用 CJS。如果你想继续这样做,可能会是:

\n
const Knex = require("knex");\n
Run Code Online (Sandbox Code Playgroud)\n

...但请参阅文档,因为它们显示将导出作为函数调用。(也许你稍后会这样做。)

\n