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;
maximedupre
źródło
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 .

Eastrall
źródło
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/'],
            },
        },
    }
}
olefrank
źródło
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

Rafael Rozon
źródło
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",
  ...
}
Raul Madrigal
źródło
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": {}
    },
  },
}
Diogo Capela
źródło
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"
        }
      }
Panie Ghamkhar
źródło
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"]
            }
        }
    }
}
John Galt
źródło
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"
}
flashmatrix
źródło
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.

vamcs
źródło
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

Jog
źródło
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!

Jakob Jan Kamminga
źródło
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"
            }
        ]
    }
swapnil jarmuż
źródło