Wie finde ich das Modul "fs" in MS Code mit TypeScript?

80

Ich laufe auf einem MacBook Air. Ich habe MS Code als IDE installiert und TypeScript installiert.

Ich habe eine einfache Datei mit nur dieser Zeile:

import fs = require('fs');

Ich bekomme ein rotes Schnörkel unter dem 'fs' in der Klammer und die Fehlermeldung lautet [ts] Cannot find module 'fs'.Die Datei hat die Erweiterung .ts. Ich bin neu in JavaScript und TypeScript, aber ich hatte den Eindruck, dass fses sich um ein Kernmodul handelt. Wie konnte es also nicht gefunden werden? Wie behebe ich das Problem?

Andere Dinge, die ich bereits versucht habe:

  • Einfügen eines einfachen Funktionskörpers in die Datei und anschließendes Kompilieren in der Befehlszeile mit tsc. Ich erhalte dort einen im Wesentlichen äquivalenten Fehler:error TS2307: Cannot find module 'fs'.
  • In der Kommandozeile sudo npm install fs -g. Dies meldet offensichtlichen Erfolg, behebt das Problem jedoch nicht.

Ich habe mich in SE und im Internet umgesehen, aber die Antworten, die nah zu sein schienen, scheinen alle davon auszugehen, dass 'fs' verfügbar ist.

Backstein
quelle
Sie führen diesen Code definitiv mit aus node?
Peteb
Der Plan ist, es mit Knoten auszuführen, ja. Der lokale Dateizugriff ist für die aktuelle Anwendung in Ordnung. @ Peteb
Brick

Antworten:

88

Sie müssen die Definitionsdatei für den Knoten einschließen.

TypeScript 2.0+

Installation mit npm:

npm install --save-dev @types/node

TypeScript <2.0

Wenn Sie Typisierungen verwenden , können Sie diesen Befehl ausführen:

typings install dt~node --global --save

Oder wenn Sie Typings <1.0 verwenden, führen Sie Folgendes aus:

typings install node --ambient --save

Wenn alles andere fehlschlägt, laden Sie die Datei hier manuell herunter und fügen Sie sie in Ihr Projekt ein.

David Sherret
quelle
1
Ich habe den Befehl verwendet, den Sie vor Ihrer Bearbeitung hatten, und das hat den Trick getan. ( typings install node --ambient --save) Danke!
Ziegel
@Brick ja das wird funktionieren. Der Befehl in der Antwort ist für die Eingabe 1.0, die gerade veröffentlicht wurde
David Sherret
Dies ist veraltet. Heutzutage sollten Typen normalerweise mit npm installiert werden, wie in Abes Antwort unten .
Dshepherd
Mit Garn:yarn add @types/node --dev
Jonathan H
Nach der Installation @types/nodemüssen Sie möglicherweise Code neu starten, damit er die Module richtig erkennt. Dies sollte nur bei nativen Knotenmodulen der Fall sein und ist je nach Code-Build möglicherweise nicht einmal ein Problem für Sie.
Don
50

Es gibt jetzt einen besseren Weg, ohne zu den vorherigen tsd- oder Tippwerkzeugen zu wechseln. NPM hat jetzt das @ types-Paket für Typoskript. In diesem Beispiel benötigen Sie das Paket @types/node:

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

Stellen Sie sicher, dass Sie die Option save-dev verwenden, um die Typen nur im Entwicklungsmodus und nicht in der Produktion zu installieren. Sie sollten über die neuesten Knotenbibliotheken verfügen, wenn Sie die npm-Installationssyntax "@ types /" verwenden ...

Das fs-Paket wurde nicht gefunden, da bei den vorherigen Tools-Eingaben höchstwahrscheinlich nicht die neueste Definitionsdatei node.d.ts verwendet wurde.

Ihre Datei tsconfig.json muss aktualisiert werden, um diese Typpakete zu finden. Mein Beispiel bei Verwendung von jquery-, jqueryui- und Knotentypen. Angenommen, Sie benötigen die Syntax, um auch für Ihren Code-Editor zu funktionieren, in diesem Fall den 'Atom'-Code-Editor

{
"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
}
}
Abe
quelle
31

"fs" ist ein Kernknotenmodul und ich denke, Ihre Syntax für Importanweisungen ist ein wenig anders. Versuchen:

import * as fs from "fs";
Eric N.
quelle
Ah, die Eingaben für Node sind nicht enthalten. Versuchen Sie, diese Datei und einen Referenzpfad hinzuzufügen: github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/…
Eric N
1
@EricN Die Seite führt zu einem 404. Typisierungen sind erforderlich, auch wenn das Modul Teil des gesamten NodeJs-Kerns ist?
Jacks
Ja, das Tippen ist notwendig. Der Knoten ist nicht in Typescript geschrieben, daher enthält er keine der Typdaten, nach denen Typescript sucht. Die Definitionsdatei enthält alle diese Typdaten für Sie.
Eric N
21

Alles was Sie brauchen ist "moduleResolution", das in Ihrer tsconfig.json auf "node" gesetzt ist:

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

ausführen

npm install @types/node --save-dev

und jetzt können Sie den Standard-TypeScript-Import verwenden:

import * as fs from "fs";
yrtimiD
quelle
Versucht, aber immer noch das gleiche Problem
Pardeep Jain
1
@pardeepjain, hast du vielleicht ein altes Typoskript? Vscode verwenden? Überprüfen Sie die Typescript-Version in der Statusleiste.
yrtimiD
4

Sie haben drei Möglichkeiten tsconfig.json(hier: Knoten 11+), siehe Dokumentation :

Geben Sie entweder beide typeRootsund typesnur an typeRootsoder entfernen Sie beide Zeilen vollständig (empfohlen):

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

Installationstypen:

npm install --save-dev @types/node

Verwenden Sie ein auf Versprechen basierendes Dateisystem (z. B. um async / await zu verwenden):

import {promises as fs} from 'fs';

async function foo() {
    ...
    await fs.writeFile('./yourPath', 'YourContent');
}
User Rebo
quelle
Als ich einen Deklarationsordner zum Ablegen meiner .d.tsDateien und ein typeRootsArray in meinem Ordner erstellt habe, hatte compilerOptionsich das nicht angegeben, node_modules/@typesund das hat den Fehler für mich verursacht. Nachdem ich das dem typeRootsArray hinzugefügt hatte, funktionierte es wieder.
str8up7od
2

Typoskript kennt Module auf Konventionen beruhen, überprüfen Auflösung Modul für mehr Details.

Damit IDE über das fsModul Bescheid weiß , müssen Sie Typisierungen für den Knoten bereitstellen.

Überprüfen Sie auch dieses Github-Problem

Madhu Ranjan
quelle