将eslint与typescript一起使用-无法解析模块的路径


124

我的文件app.spec.ts中有此导入:

import app from './app';

导致此Typescript错误的原因

2:17  error  Unable to resolve path to module './app'  import/no-unresolved

./app.ts确实存在,但是我还没有将.ts文件编译成.js文件。一旦将.ts文件编译为.js,错误就会消失。

但是,由于eslint应该使用typescript,因此应该使用.ts而不是.js解析模块。

我还在eslint配置文件中添加了打字稿信息:

"parser": "@typescript-eslint/parser",
"parserOptions": {
    "project": "./tsconfig.json"
}

如何配置eslint,使其尝试使用.ts而不是.js解析模块?

干杯!

编辑#1

内容app.ts

import bodyParser from 'body-parser';
import express from 'express';
import graphqlHTTP from 'express-graphql';
import { buildSchema } from 'graphql';

const app = express();

const schema = buildSchema(`
    type Query {
        hello: String
    }
`);
const root = { hello: () => 'Hello world!' };

app.use(bodyParser());
app.use('/graphql', graphqlHTTP({
    schema,
    rootValue: root,
    graphiql: true,
}));

export default app;

1
你加了"plugins": ["@typescript-eslint"]吗?文档github.com/typescript-eslint/typescript-eslint/tree/master/...
茉莉

1
嘿@Jasmonate,谢谢您的回答!因此,我只是添加了此配置,尽管现在可以执行一些特定于Typescript的棉绒,但它不能解决我的问题。我仍然得到Unable to resolve path to module './app'
maximedupre19年

您是否尝试过将其添加到您的.eslintrc中? settings: { 'import/resolver': 'webpack' } (我假设代码构建正常。否则,您将需要告诉webpack解析.ts / .tsx文件,这意味着添加类似以下内容:```module.exports = {resolve:{扩展名:[ '.js','.ts']}} ;;````或任何您想导入的文件扩展名!)
Abulafia

恐怕以上评论不完整!我太早按Enter了编辑时间!该 module.exports = { resolve: { extensions: ['.js', '.ts'] } }; 位应该在您的webpack配置中!
Abulafia

您可以添加app.ts文件的内容吗?
Eastrall

Answers:


291

您可以通过将以下代码段添加到.eslintrc.json配置文件中来设置ESLint模块导入分辨率:

{
  "settings": {
    "import/resolver": {
      "node": {
        "extensions": [".js", ".jsx", ".ts", ".tsx"]
      }
    }
  },
  ...
}

有关解析器的更多信息:https : //github.com/benmosher/eslint-plugin-import#resolvers


9
我相信另一个答案是正确的解决方案。
Izhaki

这似乎可以解决Unable to resolve path to module错误,但是现在我仍然遇到了一些麻烦Missing file extension "tsx" for [...]
Ryan

嗯,'import/extensions': 0,帮了忙:stackoverflow.com/questions/56064609/…–
瑞安

47

这为我做到了:

.eslintrc.js

{
    ...
    settings: {
        ...
        'import/resolver': {
            node: {
                extensions: ['.js', '.jsx', '.ts', '.tsx'],
                moduleDirectory: ['node_modules', 'src/'],
            },
        },
    }
}

3
这就是对我有用的东西;甚至包括“ plugin:import / *”扩展也没有做任何事情。moduleDirectory指向的行'src/'是使此工作继续进行的关键。
mdawsondev '20

1
这也为我工作。注意,HAD要添加“ moduleDirectory”键。
Tevon Strand-Brown

添加moduleDirectory:['node_modules','myModules /']确实有帮助。我已经看到了该解决方案的部分版本,其中没有'moduleDirectory'属性,但它无法正常工作。这是一招。
Yan Yankowski

添加moduleDirectory后可以工作:['node_modules','src /']
下划线

45

我有同样的问题,我只能使用解决此问题

"plugin:import/errors",
"plugin:import/warnings",
"plugin:import/typescript",

在.eslintrc.js中的“扩展”下,如此处所述eslint-plugin-import


6
谢谢!添加"plugin:import/typescript"对我来说是固定的。
charlax

这是唯一对我有用的,只需添加此行并保存。错误马上消失了!
brianyang

11

使用“ eslint”:“ 6.8.0”“ typescript”:“ 3.8.3”时,除了要添加以下内容.eslintrc

"settings": {
  "import/resolver": {
    "node": {
      "paths": ["src"],
      "extensions": [".js", ".jsx", ".ts", ".tsx"],
    }
  },
}

您还需要将此行添加到tsconfig.json以下compilerOptions

"compilerOptions": {
  ...
  // Base directory to resolve non-relative module names.
  "baseUrl": "src",
  ...
}

1
非常感谢您添加baseUrl选项,保存了我的一天
Tomas Vancoillie

1
在我的情况下,我必须将.d.ts添加到列表中-包csstypes仅包含一个index.d.ts:“ settings”:{“ import / resolver”:{“ node”:{“ paths”:[“ src“],” extensions“:[” .js“,”。jsx“,”。d.ts“,”。ts“,”。tsx“]}}}
httpete

7

这是唯一对我有用的解决方案。

首先,您需要安装此软件包:

yarn add -D eslint-import-resolver-typescript

然后将其添加到您的.eslintrc文件中,以便它可以将您的别名设置加载tsconfig.json到ESLint中:

{
  "settings": {
    "import/resolver": {
      "typescript": {}
    },
  },
}

5

对于那些只使用babel-module添加的人extensions,它将是这样的:

      "babel-module": {
        "extensions": [".js", ".jsx", ".ts", ".tsx"],
        "alias": {
          "app": "./app"
        }
      }

4

无论TSeslint是我狂吠,所以我不得不将以下内容添加到我的.eslintrc文件:

{ 
    ...
    "rules": {
        ....
        "import/extensions": "off"
    },
    "settings": {
        ....
        "import/resolver": {
            "node": {
                "extensions": [".js", ".jsx", ".ts", ".tsx"]
            }
        }
    }
}

如答案中所述,我需要“设置”和“规则”。谢谢!
罗宾·齐默尔曼

叫声!!脱掉帽子👏🏻–
瑜伽士

3

我必须添加typescript导入以扩展,然后在规则中关闭导入:

"extends": {
    "plugin:import/typescript"
},
"rules": {
    "import/extensions": "off"
}

2

就我而言,ESLint无法解析从DefinitelyTyped@type/软件包)安装的类型,因此我必须指定从何处找到它们,.eslintrc如下所示:

"import/resolver": {
    "typescript": {},
    "node": {
        "extensions": [".js", ".ts"],
        "paths": ["node_modules/", "node_modules/@types"]
    }
},

我还使用了"typescript": {}定义,该定义主要用于使用from中的配置,tsconfig.json并且已经eslint-import-resolver-typescript安装了该定义才能正常工作。


1

以防万一,如果有人也需要支持子目录。例如,它支持

  1. src / components / input =>组件/输入
  2. src / api / external / request =>外部/请求

    "settings": {
      "import/resolver": {
        "node": {
          "paths": ["src", "src/api"],
          "extensions": [".js", ".jsx", ".ts", ".tsx"]
        }
      }
    }
    

这是eslint ^ 6.1.0的工作示例


0

如果您已经按照其他答案中的建议更新了.eslintrctsconfig.json文件,但是仍然存在问题...重新启动vscode。

我在这个问题上停留了两个小时,而一直进行一次简单的重启就可以使编辑器找到该模块。

希望这可以节省别人的时间!


0

首先添加"plugin:import/typescript"如下扩展:

"extends": [
    "airbnb-base",
    "plugin:import/typescript"
 ],

然后根据规则

"rules": {
        "import/extensions": [
            "error",
            "ignorePackages",
            {
                "ts": "never"
            }
        ]
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.