typescript 在这种情况下,为什么我必须将TS文件导入为JS文件?

roejwanj  于 2023-05-30  发布在  TypeScript
关注(0)|答案(1)|浏览(174)

我正在帮助一个使用WebdriverIO的测试项目。我们在TS serrtings上遇到了巨大的困难,因为TS转译器似乎可以正确解析TS模块,但在运行时解析失败。
例如,如果我有一个模块:

// config/config.ts
export const config = {};

然后是一个文件:

// someTest.ts
import { config } from './config/config`;

然后TS将正确显示config的类型。然而,当运行套件时,我会得到这样的消息:

[0-2] 2023-04-18T09:07:54.651Z ERROR @wdio/runner: Error: Cannot find module '/Users/ronnyefronny/projects/wdio-demo/config/config' imported from /Users/ronnyefronny/projects/wdio-demo/test/step-definitions/VoiceflowStepDefs.ts

我的tsconfig.json是:

{
  "compilerOptions": {
    "moduleResolution": "node",
    "declaration": true,
    "module": "ESNext",
    "baseUrl": "./",
    "types": [
      "node",
      "@wdio/globals/types",
      "expect-webdriverio",
      "@wdio/cucumber-framework",
    ],
    "target": "ESNext",
    "esModuleInterop": true,
    "resolveJsonModule": true,
  }
}

其余的WDIO配置是按照他们的文档推荐的,仍然什么都没有。
让我困惑的是,在their own example boilerplate repo中,WDIO将TS模块导入为JS,这让我困惑不已。我已经在后端和前端项目中使用TS几年了,从来不需要导入TS模块作为其编译的JS对应物。
也就是说,而不是

import { config } from './config/config';

就可以了

import { config } from './config/config.js';

我很想知道为什么会发生这种情况,更具体地说,为什么在这种情况下我不能使用常规的TS导入。有什么区别吗?

amrnrhlw

amrnrhlw1#

我通过在tsconfig.json中添加allowImportingTsExtensions解决了这个问题。
tsconfig.json现在

{
  "compilerOptions": {
    "moduleResolution": "node",
    "module": "esnext",
    "types": [
      "node",
      "@wdio/globals/types",
      "wdio-intercept-service",
      "@wdio/mocha-framework"
    ],
    "target": "es2022",
    "lib": ["esnext"],
    "allowImportingTsExtensions": true,  <---- This ignored the error
    "noEmit": true                       <---- Since "allowImportingTsExtensions" can only work along with "noEmit" I had to add this too
  },
  "include": ["e2e/**/*.ts"],
  "exclude": ["node_modules"]
}

它是如此漂亮,VS代码给了一个提示,但我没有完全阅读它。

p.p.s
顺便说一句,VS代码建议添加allowImportingTsExtensions只有当你设置你的VS代码编译器版本为v5.0.4最初我选择了v4.8.4它没有建议我。这是因为TS v5.0中引入了此选项

相关问题