使用带有打字稿的 eslint - 无法解析模块的路径

Posted

技术标签:

【中文标题】使用带有打字稿的 eslint - 无法解析模块的路径【英文标题】:Using eslint with typescript - Unable to resolve path to module 【发布时间】:2019-08-07 11:19:28 【问题描述】:

我的文件 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;

【问题讨论】:

你添加"plugins": ["@typescript-eslint"]了吗?文档github.com/typescript-eslint/typescript-eslint/tree/master/… 嘿@Jasmonate,感谢您的回答!所以我刚刚添加了这个配置,虽然我现在可以做一些特定于 Typescript 的 linting,但它并不能解决我的问题。我仍然收到Unable to resolve path to module './app' 您是否尝试将其添加到您的 .eslintrc 中? settings: 'import/resolver': 'webpack' (我假设代码构建正常。如果不是,您需要告诉 webpack 也解析 .ts/.tsx 文件,这意味着添加类似:```module.exports = resolve: extensions: ['.js', '.ts'] ; ``` 或任何你想导入的文件扩展名!) 以上评论不完整,恐怕!我的编辑时间用完了,我太快按下了 Enter! module.exports = resolve: extensions: ['.js', '.ts'] ; 位应该在你的 webpack 配置中! 你可以添加你的app.ts文件的内容吗? 【参考方案1】:

您可以通过将此 sn-p 添加到您的 .eslintrc.json 配置文件中来设置 ESLint 模块导入分辨率:


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

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

【讨论】:

我相信other answer 是解决这个问题的正确方法。 这似乎解决了Unable to resolve path to module 错误,但现在我仍然收到一堆Missing file extension "tsx" for [...] 啊,'import/extensions': 0, 帮助:***.com/questions/56064609/… 这是那个时代之一!我遇到了这个问题,使用了这个解决方案,但它没有用。几个小时后又试了一次,然后就可以了。奇怪!【参考方案2】:

我遇到了同样的问题,我只能通过使用 extends option in .eslintrc 将 typescript 插件添加到 .eslintrc 来解决它

  extends: [
    "plugin:import/errors",
    "plugin:import/warnings",
    "plugin:import/typescript",
  ],

【讨论】:

谢谢!添加"plugin:import/typescript" 是为我解决的问题。 这是唯一对我有用的,只需添加这一行并保存。错误马上就消失了! 请注意,您需要 1. 在“airbnb-base”之后放置“plugin:import/typescript”。 2.记得在plugins部分添加"import" 现在我得到Missing file extension "ts" for <file> ^ 固定为:***.com/a/59268871/12658818【参考方案3】:

这对我有用:

.eslintrc.js


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

【讨论】:

这对我有用;甚至包括“plugin:import/*”扩展也没有做任何事情。指向'src/'moduleDirectory 行是我完成这项工作的关键。 这对我也有用。请注意,必须添加“moduleDirectory”键。 添加 moduleDirectory: ['node_modules', 'myModules/'] 确实有帮助。我已经看到这个解决方案的部分版本没有“moduleDirectory”属性,但它不起作用。这个成功了。 添加 moduleDirectory: ['node_modules', 'src/'] 这对我有用,在 typescript react 项目中使用 .eslintrc.json 中的相同配置。【参考方案4】:

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

首先,你需要安装这个包:

yarn add -D eslint-import-resolver-typescript

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


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

【讨论】:

当使用 monorepo 和不同包的路径别名时,这是唯一对我有用的。 @Semx11,这里也一样! 这是我唯一的解决方案 thx ;) ` "typescript": ` 对我有用。 感谢您的解决方案,其他解决方案对我的用例没有帮助【参考方案5】:

当使用 "eslint": "6.8.0""typescript": "3.8.3" 时,除了在.eslintrc 中添加以下内容:

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

您还需要将此行添加到tsconfig.jsoncompilerOptions

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

【讨论】:

非常感谢添加baseUrl 选项,节省了我的一天 在我的情况下,我必须将 .d.ts 添加到列表中 - 包 csstypes 仅包含一个 index.d.ts: "settings": "import/resolver": "node" : "paths": [ "src" ], "extensions": [ ".js", ".jsx", ".d.ts", ".ts", ".tsx" ] 这也可以解决 eslint 配置在多个项目之间共享,因此位于***文件夹中的情况。在paths 属性中列出所有项目的路径可以解决 eslint 错误。【参考方案6】:

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

【讨论】:

这对我有用!!谢谢你:)【参考方案7】:

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

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

【讨论】:

确实如此。我的“babel-module”只有 【参考方案8】:

tseslint 都对我大吼大叫,所以我不得不将以下内容添加到我的 .eslintrc 文件中:

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

【讨论】:

我需要“设置”和“规则”,如本答案中所述。谢谢! 狂吠!!脱帽??【参考方案9】:

首先在扩展下添加"plugin:import/typescript",如下所示:

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

然后在规则之下

"rules": 
        "import/extensions": [
            "error",
            "ignorePackages",
            
                "ts": "never"
            
        ]
    

【讨论】:

【参考方案10】:

就我而言,ESLint 无法解析从DefinitelyTyped@type/ 包)安装的类型,因此我必须指定在.eslintrc 中的位置,如下所示:

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

我还添加了"typescript": ,它基本上用于使用来自tsconfig.json 的配置,并且我安装了eslint-import-resolver-typescript 以便它工作。

【讨论】:

【参考方案11】:

我不得不将打字稿导入添加到扩展中,然后在规则中关闭导入:

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

【讨论】:

这并不能解决问题,只是关闭了规则【参考方案12】:

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

    src/components/input => 组件/输入

    src/api/external/request => 外部/请求

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

这是 eslint ^6.1.0

的工作示例

【讨论】:

【参考方案13】:

对我来说,它只是简单地安装eslint-import-resolver-node:

yarn add -D eslint-import-resolver-node
# or
npm install eslint-import-resolver-node --save-dev

【讨论】:

【参考方案14】:

在为 Angular 导入语言环境文件(例如 import localeFr from '@angular/common/locales/fr';)时,我必须允许 .mjs 扩展名。

这是我.eslintrc.json的摘录:

  ...
  "extends": [
    ...
    "plugin:import/recommended",
    "plugin:import/typescript",
    ...
  ],
  "settings": 
    "import/resolver": 
      "node": 
        "extensions": [".ts", ".mjs"]
      
    
  ,
  "rules": 
    ...
  
  ...

【讨论】:

【参考方案15】:

我使用 ts monorepo 的情况是,我在 IDE 中没有遇到 lint 错误,所有别名都已解决,但是当我在其中一个项目上运行 eslint 时,我得到了

error  Unable to resolve path to module

显示每个包的 tsconfig 文件的 eslint 路径很重要。

总结一下,对于那些有 TS、别名和 monorepo 的人:

安装eslint-import-resolver-typescript 添加到eslintrc.js 设置(这将有助于 ide 和 eslint 识别别名和东西):
    'import/resolver': 
      node: 
        paths: 'packages/*/src',
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      ,
      typescript: 
        alwaysTryTypes: true,
        project:[
         path.resolve(__dirname, '.tsconfig.json'), // root tsconfig
         path.resolve(__dirname, './packages/projA/tsconfig.json'),
         path.resolve(__dirname, './packages/projB/tsconfig.json'),
         /* ...rest of projects path to its tsconfig */
        ],
      ,
添加到eslintrc.js 扩展:

 ...,
   'plugin:import/recommended',
   'plugin:import/typescript',


添加到eslintrc.js插件:
  plugins: ['@typescript-eslint', ..., 'import'],
添加到eslintrc.js parserOptions(与设置相同)这将有助于 eslint:
        project: [
          path.resolve(__dirname, '.tsconfig.json'), // root tsconfig
          path.resolve(__dirname, './packages/projA/tsconfig.json'),
          path.resolve(__dirname, './packages/projB/tsconfig.json'),
          /* ...rest of projects path to its tsconfig */
        ],

【讨论】:

以上是关于使用带有打字稿的 eslint - 无法解析模块的路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有打字稿的“调试”模块

带有打字稿的角度材料设计

如何修复 eslint 抱怨打字稿的路径别名

带有打字稿的玩笑无法识别功能完成()

无法在带有打字稿的 vue 中使用 Mixins

带有打字稿的VueJS单文件组件:找不到模块stuff.vue