为什么我必须在我的typescript导入语句中显式地指定.ts(在playwright框架内运行)

mzsu5hc0  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(101)

我试着写一些剧作家测试,需要一些设置。这个设置在剧作家配置文件中被称为全局设置。
安装程序有一个import语句:
import { X, Y, Z} from '../../fixtures';
下面是我的tsconfig.json:

{
    "compilerOptions": {
        "target": "es2018",
        "module": "Node16",
        "experimentalSpecifierrResolution": "node",
        "sourceMap": true,
        "esModuleInterop": true,
        "strict": false,
        "lib": [
            "dom",
            "es2018"
        ],
        "types": [
            "node",
            "cypress",
            "cypress-real-events"
        ],
        "moduleResolution": "node",

    },
    "include": [
        "**/*.ts"
    ]
}

当然,在我的package.json文件中,我有:"type": "module"
我不明白的是,当我尝试运行这些测试时,我得到以下错误:

Error: Cannot find module 'C:\Users\x\project\e2e\fixtures' imported from C:\Users\x\projects\e2e\playwright\support\setupTests.ts

但是如果我使用扩展名导入:import { X, Y, Z} from '../../fixtures.ts';

一切顺利。
我不明白。尤其是我在安装文件中有其他不使用.ts扩展名的导入,它们不会引起任何问题。
我已经在我的import语句中包含了.ts扩展名的变通方法。它实际上正确地运行了我的测试和安装文件。
唯一的问题是我在IDE中得到一个Typescript警告:TS2691:导入路径不能以“.ts”扩展名结尾。
我对这种行为感到困惑。

bvjveswy

bvjveswy1#

好吧,我终于明白它是怎么工作的了。
阅读完这里:https://www.typescriptlang.org/docs/handbook/esm-node.html
执行相对导入的正确方法是:

import {X, Y, Z} from '../../fixtures.js';

当你有fixtures.ts时,Typescript会感到困惑,并会给予你警告。如果没有扩展名,编译后的javascript文件就没有意义了,因为ESM希望你有扩展名:
相对导入路径需要完整的扩展名(例如,我们必须写import“./foo.js”而不是import“./foo”)
所以是的,我仍然觉得导入一个还不存在的文件有点奇怪。但这只是 typescript 的一个特点。

相关问题