Jak znaleźć moduł „fs” w VS Code za pomocą TypeScript?


83

Używam MacBooka Air. Zainstalowałem VS Code jako IDE i mam też zainstalowany TypeScript.

Mam prosty plik z tą linią:

import fs = require('fs');

W nawiasie pojawia się czerwona falista pod znakiem „fs”, a komunikat o błędzie to [ts] Cannot find module 'fs'.„Plik ma rozszerzenie .ts”. Jestem nowy w JavaScript i TypeScript, ale miałem wrażenie, że fsjest to podstawowy moduł, więc jak można go nie znaleźć? Jak rozwiązać problem?

Inne rzeczy, które już próbowałem:

  • Umieszczenie prostej treści funkcji w pliku, a następnie kompilowanie w wierszu poleceń za pomocą tsc. Otrzymuję tam zasadniczo równoważny błąd:error TS2307: Cannot find module 'fs'.
  • W linii poleceń sudo npm install fs -g. Powoduje to pozorny sukces, ale nie rozwiązuje problemu.

Szperałem po SE i Internecie, ale odpowiedzi, które wydawały się bliskie, wydają się zakładać, że „fs” jest dostępne.


Na pewno wykonujesz ten kod za pomocą node?
peteb

Plan jest taki, aby wykonać to z węzłem, tak. Dostęp do pliku lokalnego jest prawidłowy dla bieżącej aplikacji. @peteb
Brick,

Odpowiedzi:


96

Musisz dołączyć plik definicji dla node.

TypeScript 2.0+

Zainstaluj przy użyciu npm:

npm install --save-dev @types/node

TypeScript <2.0

Jeśli używasz pisania , możesz uruchomić to polecenie:

typings install dt~node --global --save

Lub jeśli używasz typów <1.0 run:

typings install node --ambient --save

Jeśli wszystko inne zawiedzie, pobierz plik ręcznie tutaj i dołącz go do projektu.


1
Użyłem polecenia, które miałeś przed edycją i to załatwiło sprawę. ( typings install node --ambient --save) Dzięki!
Brick

@Brick tak, to zadziała. Polecenie w odpowiedzi dotyczy wpisów 1.0, które właśnie zostało wydane
David Sherret

To jest nieaktualne, obecnie typy powinny być zwykle instalowane z npm, jak w odpowiedzi Abe poniżej .
dshepherd

Z przędzą:yarn add @types/node --dev
Jonathan H

Po zainstalowaniu @types/nodemoże być konieczne ponowne uruchomienie kodu, aby poprawnie rozpoznał moduły. Powinno to mieć miejsce tylko w przypadku natywnych modułów węzłów i może nawet nie stanowić problemu w zależności od wersji kodu.
Don

50

Jest teraz lepszy sposób bez przechodzenia do poprzedniego narzędzia tsd lub pisania. NPM ma teraz pakiet @types dla maszynopisu. W tym przykładzie potrzebujesz pakietu @types/node:

npm install "@types/node" --save-dev

Upewnij się, że używasz opcji save-dev, aby zainstalować typy tylko w trybie programistycznym, a nie w środowisku produkcyjnym. Jeśli używasz składni „@ types /” instalacji npm, powinieneś mieć najnowsze biblioteki węzłów ...

Nie znajduje pakietu fs, ponieważ poprzednie wpisy narzędzi najprawdopodobniej nie używają najnowszego pliku definicji node.d.ts.

Aby znaleźć pakiety tego typu, należy zaktualizować plik tsconfig.json. Mój przykład, jeśli używasz typów jquery, jqueryui i node. Zakładając, że składnia będzie działać również dla Twojego edytora kodu, w tym przypadku edytora kodu „atom”

{
"compileOnSave": false,
"compilerOptions": {
    "rootDir": "src",
    "sourceMap": true,
    "target": "es5",
    "module": "amd",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "lib": ["es2015", "dom"],
    "baseUrl": "./",
    "typeRoots": [
        "node_modules/@types"
    ],
    "types": [
        "jquery",
        "jqueryui",
        "node"
    ],
    "paths": {
        "src/*": ["src/*"]
    }
},
"exclude": [
    "node_modules",
    "dist",
    "build"
],
"filesGlob": [
    "./src/**/*.ts",
    "./test/**/*.ts",
    "./typings/index.d.ts",
    "./custom_typings/**/*.d.ts",
    "./node_modules/@types/**/*.d.ts"
],
"atom": {
    "rewriteTsconfig": false
}
}

32

„fs” jest podstawowym modułem Node i myślę, że składnia instrukcji importu jest trochę niewłaściwa. Próbować:

import * as fs from "fs";

Ah, nie uwzględniono typów dla Node. Spróbuj dodać ten plik i ścieżkę do niego odniesienia: github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/ ...
Eric N

1
@EricN Strona prowadzi do 404. Typy są potrzebne, nawet jeśli moduł jest częścią całego rdzenia NodeJs?
Jacks

Tak, wpisanie jest konieczne. Węzeł nie jest napisany w skrypcie Typescript, więc nie ma żadnych danych typu, których szuka Typescript. Plik definicji zawiera wszystkie dane tego typu.
Eric N

21

Wszystko, czego potrzebujesz, to „moduleResolution” ustawione na „node” w pliku tsconfig.json:

{
  "compilerOptions": {
      ...
      "moduleResolution": "node"
      ...
  }
}

wykonać

npm install @types/node --save-dev

a teraz możesz użyć standardowego importu TypeScript:

import * as fs from "fs";

Próbowałem, ale wciąż
mam ten

1
@pardeepjain, jest jakaś szansa, że ​​masz stary maszynopis? Używasz vscode? Sprawdź wersję Typescript na pasku stanu.
yrtimiD

4

Masz trzy opcje w tsconfig.json(tutaj: Węzeł 11+), zobacz dokumentację :

Albo specifiy zarówno typeRootsi typestylko typeRootslub usunąć obie linie całkowicie (zalecane):

{"compilerOptions": {
  ...
  "typeRoots": ["node_modules/@types"],  // "typeRoots": [] -> won't work
  "types": ["node"]                      // "types": [] -> won't work
}}

Typy instalacji:

npm install --save-dev @types/node

Użyj systemu plików opartego na obietnicy (np. Aby użyć async / await):

import {promises as fs} from 'fs';

async function foo() {
    ...
    await fs.writeFile('./yourPath', 'YourContent');
}

Kiedy utworzyłem folder deklaracji, aby umieścić w nim moje .d.tspliki i utworzyłem typeRootstablicę w moim compilerOptions, nie określiłem node_modules/@typesi to właśnie spowodowało błąd. Po dodaniu tego do typeRootstablicy znów zadziałało.
str8up7od

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.