typescript 在不同的文件中导入相同的库会产生编译器冲突

r1wp621o  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(137)

我正在尝试学习typescript,并创建了一个简单的typescript node js服务器,它有两个端点。尝试两个单元测试文件,并得到以下错误:

TSError: ⨯ Unable to compile TypeScript:
test/endpoint2.test.ts:6:7 - error TS2451: Cannot redeclare block-scoped variable 'chai_1'.

6 const chai_1 = __importDefault(require("chai"));
        ~~~~~~

  test/endpoint.test.ts:6:7
    6 const chai_1 = __importDefault(require("chai"));
            ~~~~~~
    'chai_1' was also declared here.

测试文件1(endpoint.test.ts):

import chai from 'chai';
import chaiHttp from 'chai-http';
import { app } from '../src/index';

chai.use(chaiHttp);

describe('Endpoint tests', () => {
    it('Ping endpoint should return status 200', (done) => {
        const msg = "hello";
        chai.request(app)
            .get('/ping')
            .query({
                "message": msg
            })
            .end((err, res) => {
                chai.expect(res).to.have.status(200);
                chai.expect(res.body).to.have.property("env", "TEST")
                chai.expect(res.body).to.have.property("version", "1.0.0")
                done();
            });
    });
});

测试文件2(endpoint2.test.ts):

import chai from 'chai';
import chaiHttp from 'chai-http';
import { app } from '../src/index';

chai.use(chaiHttp);

describe('Endpoint2', () => {
    it('Hello world endpoint should return status 200', (done) => {
        const msg = "hello";
        chai.request(app)
            .get('/')
            .end((err, res) => {
                chai.expect(res).to.have.status(200);
                done();
            });
    });
});

package.json:

{
  "name": "sample_ts_server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --exec NODE_ENV=DEV 'ts-node' src/index.ts",
    "test": "ts-node ./node_modules/mocha/bin/mocha --exit --require ts-node/register test/**/*.test.ts"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/cors": "^2.8.13",
    "@types/express": "^4.17.17",
    "@types/mocha": "^10.0.1",
    "chai": "^4.3.7",
    "chai-http": "^4.3.0",
    "mocha": "^10.2.0",
    "nodemon": "^2.0.22",
    "ts-node": "^10.9.1",
    "typescript": "^5.0.2"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.2"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "esModuleInterop": true,
    "outDir": "./dist",
    "sourceMap": true,
    "moduleDetection": "auto",
    "noEmit": true
  },
  "include": [
    "./src/**/*"
  ]
}

通过package.json脚本运行测试

"scripts": {
    "test": "ts-node ./node_modules/mocha/bin/mocha --exit --require ts-node/register test/**/*.test.ts"
  },

如何告诉typescript编译器不要在不同文件中的导入上出错?
尝试:
1.在test/libs中创建了一个库文件,保存所有导入,然后将其导出到测试文件中。同样的错误。
1.尝试翻转不同的tsconfig标志,但未成功
1.尝试将'import'替换为'require'。这可以工作,但IDE警告我不要这样做。我想我应该可以使用import。
1.我所有的谷歌提示都把我带到了一个非常不同的方向。

wnavrhmk

wnavrhmk1#

我在使用CodeceptJS和Typescript时遇到了类似的问题。我有一个自定义脚本,它创建Codecept配置并运行测试(而不是直接使用npx codeceptjs运行)。我能够将此范围缩小到Codecept(重新)注册ts-node(请参阅https://github.com/codeceptjs/CodeceptJS/blob/3.x/lib/config.js#L152)。
你可以做的是检查你的依赖是否也在做同样的事情。如果你设法找到了罪魁祸首,看看是否有任何配置选项允许你禁用这个行为。
在2017年,ts-node的Github上有一个issue,其中包含了一些关于这个问题的额外讨论。它还包含了另一种可能的解决方法,即覆盖register函数,尽管我不能说这有多安全(可能不理想)

相关问题