Używanie eslint z maszynopisem - nie można rozpoznać ścieżki do modułu


124

Mam ten import w moim pliku app.spec.ts :

import app from './app';

Co powoduje ten błąd maszynopisu

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

./app.ts istnieje, ale nie skompilowałem pliku .ts do pliku .js. Jak tylko skompiluję plik .ts do .js, błąd zniknie.

Jednak ponieważ eslint ma działać z maszynopisem, powinien rozwiązywać moduły z .ts, a nie .js.

Dodałem również informacje na maszynie do mojego eslintpliku konfiguracyjnego:

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

Jak skonfigurować eslint w taki sposób, aby próbował rozwiązać moduły z .ts, a nie .js?

Twoje zdrowie!

EDYCJA # 1

Treść 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
Czy dodałeś "plugins": ["@typescript-eslint"]? Dokumenty github.com/typescript-eslint/typescript-eslint/tree/master/…
Jasmonate

1
Hej @Jasmonate, dzięki za odpowiedź! Właśnie dodałem tę konfigurację i chociaż mogę teraz wykonać pewne lintowanie specyficzne dla Typescript, nie rozwiązuje to mojego problemu. Nadal dostajęUnable to resolve path to module './app'
maximedupre

Czy próbowałeś dodać to do swojego .eslintrc? settings: { 'import/resolver': 'webpack' } (Zakładam, że kod buduje się dobrze. Jeśli nie, będziesz musiał powiedzieć webpackowi, aby rozwiązał również pliki .ts / .tsx, co oznacza dodanie czegoś takiego jak: `` module.exports = {rozwiąż: {rozszerzenia: [ '.js', '.ts']}}; `` lub jakiekolwiek rozszerzenia plików, które chcesz importować!)
Abulafia

Obawiam się, że powyższy komentarz jest niekompletny! Skończył mi się czas edycji, ponieważ zbyt wcześnie nacisnąłem enter! module.exports = { resolve: { extensions: ['.js', '.ts'] } }; Bit powinien być w swoim WebPACK config!
Abulafia

Czy możesz dodać zawartość swojego app.tspliku?
Eastrall

Odpowiedzi:


291

Możesz ustawić rozdzielczość importu modułu ESLint, dodając ten fragment do .eslintrc.jsonpliku konfiguracyjnego:

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

Więcej informacji na temat resolverów: https://github.com/benmosher/eslint-plugin-import#resolvers .


9
Uważam, że druga odpowiedź jest właściwym rozwiązaniem.
Izhaki

Wydawało się, że to rozwiązało Unable to resolve path to modulebłąd, ale teraz wciąż otrzymuję kilkaMissing file extension "tsx" for [...]
Ryan

Ahh, 'import/extensions': 0,pomogłem: stackoverflow.com/questions/56064609/…
Ryan

47

Robi to dla mnie:

.eslintrc.js

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

3
To właśnie zadziałało dla mnie; nawet włączenie rozszerzenia „plugin: import / *” nic nie dało. moduleDirectoryLinia wskazując 'src/'był klucz do uzyskać tej pracy na mój koniec.
mdawsondev

1
To zadziałało również dla mnie. Zauważ, że MUSIAŁE dodać klucz „moduleDirectory”.
Tevon Strand-Brown

Dodanie modułu moduleDirectory: ['node_modules', 'myModules /'] rzeczywiście pomogło. Widziałem częściową wersję tego rozwiązania bez właściwości „moduleDirectory” i nie działa. Ten załatwił sprawę.
Yan Yankowski

działa po dodaniu moduleDirectory: ['node_modules', 'src /']
podkreślenie

45

Miałem ten sam problem i mogłem go naprawić tylko za pomocą

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

pod "extends" w .eslintrc.js, jak opisano tutaj eslint-plugin-import


6
Dzięki! Dodanie "plugin:import/typescript"jest tym, co naprawiło to dla mnie.
charlax

to jest jedyny, który działał dla mnie, po prostu dodaj tę linię i zapisz. błąd zniknął od razu!
brianyang

11

W przypadku korzystania z „eslint”: „6.8.0” z „maszynopisem”: „3.8.3” oprócz dodania następujących elementów do .eslintrc:

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

Musisz również dodać tę linię tsconfig.jsonpod compilerOptions:

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

1
Ogromnie doceniam dodanie baseUrlopcji, uratowałem mój dzień
Tomas Vancoillie

1
W moim przypadku musiałem dodać .d.ts do listy - pakiet csstypes zawiera tylko index.d.ts: "settings": {"import / resolver": {"node": {"path": [" src "]," extensions ": [" .js "," .jsx "," .d.ts "," .ts "," .tsx "]}}}
httpete

7

To było jedyne rozwiązanie, które działało dla mnie.

Najpierw musisz zainstalować ten pakiet:

yarn add -D eslint-import-resolver-typescript

Następnie dodaj to do swojego .eslintrcpliku, aby mógł załadować ustawienia aliasu z twojego tsconfig.jsondo ESLint:

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

5

dla tych, którzy używają babel-modulewystarczy dodać, extensionswięc byłoby coś takiego:

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

4

Zarówno ts, jak i eslint szczekali na mnie, więc musiałem dodać do mojego pliku .eslintrc :

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

Potrzebowałem zarówno „ustawień”, jak i „reguł” opisanych w tej odpowiedzi. Dzięki!
Robin Zimmermann

korowanie!! Czapki z głów 👏🏻
Yogi

3

Musiałem dodać import maszynopisu do rozszerzeń, a następnie wyłączyć importowanie w regułach:

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

2

W moim przypadku ESLint nie był w stanie rozwiązać typów zainstalowanych z DefinitelyTyped( @type/pakietów), więc musiałem określić, gdzie je znaleźć .eslintrc:

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

Używam również "typescript": {}definicji, która jest w zasadzie do używania konfiguracji z tsconfig.jsoni eslint-import-resolver-typescriptzainstalowałem ją, aby działała.


1

Na wypadek, gdyby ktoś również potrzebował obsługi katalogu podrzędnego. Na przykład obsługuje

  1. src / components / input => components / input
  2. src / api / external / request => external / request

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

To działa przykład dla eslint ^ 6.1.0


1

Jeśli zaktualizowałeś pliki .eslintrci tsconfig.jsonzgodnie z sugestiami w innych odpowiedziach, a nadal masz problem ... uruchom ponownie vscode.

Utknąłem na tym problemie przez dwie godziny, przez cały czas prosty restart spowodowałby, że edytor znalazłby moduł.

Mam nadzieję, że to zaoszczędzi czas komuś innemu!


0

Najpierw dodaj "plugin:import/typescript"pod rozszerzeniami jak poniżej:

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

następnie poniżej zgodnie z zasadami

"rules": {
        "import/extensions": [
            "error",
            "ignorePackages",
            {
                "ts": "never"
            }
        ]
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.