การใช้ 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

ฉันได้เพิ่มข้อมูล typescript ใน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"]? Docs github.com/typescript-eslint/typescript-eslint/tree/master/…
Jasmonate

1
เฮ้ @Jasmonate ขอบคุณสำหรับคำตอบ! ดังนั้นฉันจึงเพิ่มการกำหนดค่านี้และในขณะที่ฉันสามารถทำขุยเฉพาะ typescript ได้ แต่ก็ไม่สามารถแก้ปัญหาของฉันได้ ฉันยังคงได้รับUnable to resolve path to module './app'
maximedupre

คุณได้ลองเพิ่มสิ่งนี้ลงใน. eslintrc ของคุณแล้วหรือยัง? settings: { 'import/resolver': 'webpack' } (ฉันสมมติว่าสร้างโค้ดได้ถ้าไม่เป็นเช่นนั้นคุณจะต้องแจ้งให้ webpack แก้ไขไฟล์. ts / .tsx ด้วยซึ่งหมายถึงการเพิ่มบางสิ่งเช่น: `` module.exports = {help: {extensions: [ '.js', '.ts']}}; `` หรือนามสกุลไฟล์อะไรก็ได้ที่คุณต้องการให้สามารถนำเข้าได้!)
Abulafia

ความคิดเห็นด้านบนไม่สมบูรณ์ฉันกลัว! ฉันหมดเวลาแก้ไขเมื่อกด Enter เร็วเกินไป! module.exports = { resolve: { extensions: ['.js', '.ts'] } }; บิตควรจะอยู่ในการตั้งค่า webpack ของคุณ!
Abulafia

คุณสามารถเพิ่มเนื้อหาของapp.tsไฟล์ของคุณได้หรือไม่?
Eastrall

คำตอบ:


291

คุณสามารถตั้งค่าความละเอียดการนำเข้าโมดูล ESLint ได้โดยเพิ่มข้อมูลโค้ดนี้ใน.eslintrc.jsonไฟล์การกำหนดค่าของคุณ:

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

ข้อมูลเพิ่มเติมเกี่ยวกับ resolvers: 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/…
Ryan

47

สิ่งนี้สำหรับฉัน:

.eslintrc.js

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

3
นี่คือสิ่งที่ได้ผลสำหรับฉัน แม้แต่การรวมส่วนขยาย "plugin: import / *" ก็ไม่ได้ทำอะไรเลย moduleDirectoryชี้บรรทัดเพื่อ'src/'เป็นกุญแจสำคัญที่จะได้รับการทำงานนี้ในส่วนของฉัน
mdawsondev

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

ทั้งtsและeslintเห่าใส่ฉันดังนั้นฉันต้องเพิ่มสิ่งต่อไปนี้ในไฟล์. eslintrcของฉัน:

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

ฉันต้องการทั้ง "การตั้งค่า" และ "กฎ" ตามที่อธิบายไว้ในคำตอบนี้ ขอบคุณ!
Robin Zimmermann

เห่า !! Hats off👏🏻
Yogi


2

ในกรณีของฉัน ESLint ไม่สามารถแก้ไขประเภทที่ติดตั้งจากDefinitelyTyped( @type/แพ็คเกจ) ได้ดังนั้นฉันจึงต้องระบุตำแหน่งที่จะหาได้ใน.eslintrcลักษณะนี้:

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

ฉันยังใช้"typescript": {}defnition ซึ่งโดยพื้นฐานแล้วสำหรับการใช้การกำหนดค่าจากtsconfig.jsonและฉันได้eslint-import-resolver-typescriptติดตั้งเพื่อให้ใช้งานได้


2

หากคุณอัปเดต.eslintrcและtsconfig.jsonไฟล์ของคุณตามที่แนะนำในคำตอบอื่น ๆ แล้วและคุณยังคงพบปัญหา ... รีสตาร์ท vscode

ฉันติดปัญหานี้เป็นเวลาสองชั่วโมงในขณะที่การรีสตาร์ทอย่างง่ายจะทำให้ตัวแก้ไขพบโมดูล

หวังว่านี่จะช่วยคนอื่นได้!


1

ในกรณีถ้าใครต้องการสนับสนุนไดเรกทอรีลูกด้วย ตัวอย่างเช่นรองรับ

  1. src / components / input => ส่วนประกอบ / อินพุต
  2. src / api / external / request => ภายนอก / request

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

นี่คือตัวอย่างการทำงานสำหรับeslint ^ 6.1.0


0

เพิ่มครั้งแรก"plugin:import/typescript"ภายใต้การขยายดังนี้:

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

จากนั้นด้านล่างภายใต้กฎ

"rules": {
        "import/extensions": [
            "error",
            "ignorePackages",
            {
                "ts": "never"
            }
        ]
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.