使“导入/扩展”需要 Node.js TypeScript 项目中的 .js 扩展名

Dis*_*tum 9 node.js typescript eslint typescript-eslint

首先,一些事实:

  • Node.js 要求所有本地import包含导入模块的扩展名(例如import hello from './hello.js',不是import hello from './hello')。
  • TypeScript 将编译import带或不带.js扩展名的 s,这意味着缺少.js扩展名是运行时错误。
  • TypeScript 不会转换imports 以添加.js扩展名或转换.ts.js.

在我的 Node.js 项目中,我希望.js使用 ESLint 规则将缺少扩展名作为构建时错误import/extensions。但是,当我使用以下配置启用此规则时:

{
  "root": true,
  "env": {
    "node": true
  },
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:import/recommended",
    "plugin:import/typescript",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "settings": {
    "import/resolver": {
      "typescript": {},
      "node": {
        "extensions": [".js"]
      }
    }
  },
  "rules": {
    "import/extensions": ["error", "ignorePackages"]
  }
}
Run Code Online (Sandbox Code Playgroud)

运行eslint给我以下错误:

/sandbox/src/index.ts
  1:19  error  Missing file extension "ts" for "./hello.js"  import/extensions
Run Code Online (Sandbox Code Playgroud)

源文件:

// index.ts
import hello from "./hello.js";

hello();
Run Code Online (Sandbox Code Playgroud)
// hello.ts
export default function hello() {
  console.log("Hello");
}
Run Code Online (Sandbox Code Playgroud)

CodeSandbox 链接:https://codesandbox.io/s/elated-germain-13glp7

Dis*_*tum 4

我用以下配置修复了这个问题:

{
  "root": true,
  "env": {
    "node": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:import/recommended",
    "plugin:import/typescript",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "rules": {
    "import/extensions": ["error", "ignorePackages"],
    "import/no-unresolved": "off"
  }
}
Run Code Online (Sandbox Code Playgroud)

最主要的是禁用"import/no-unresolved"规则并删除"settings"."import/resolver"."node". ("import/no-unresolved"这是多余的,因为未解决的导入在编译阶段已解决。)由于扩展插件,此处删除的其他项目已被添加@typescript-eslint