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 fs
jest 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.
javascript
typescript
tsc
Cegła
źródło
źródło
node
?Odpowiedzi:
Musisz dołączyć plik definicji dla node.
TypeScript 2.0+
Zainstaluj przy użyciu npm:
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:
Jeśli wszystko inne zawiedzie, pobierz plik ręcznie tutaj i dołącz go do projektu.
źródło
typings install node --ambient --save
) Dzięki!yarn add @types/node --dev
@types/node
moż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.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 } }
źródło
„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";
źródło
Wszystko, czego potrzebujesz, to „moduleResolution” ustawione na „node” w pliku tsconfig.json:
{ "compilerOptions": { ... "moduleResolution": "node" ... } }
wykonać
a teraz możesz użyć standardowego importu TypeScript:
import * as fs from "fs";
źródło
Masz trzy opcje w
tsconfig.json
(tutaj: Węzeł 11+), zobacz dokumentację :Albo specifiy zarówno
typeRoots
itypes
tylkotypeRoots
lub usunąć obie linie całkowicie (zalecane):{"compilerOptions": { ... "typeRoots": ["node_modules/@types"], // "typeRoots": [] -> won't work "types": ["node"] // "types": [] -> won't work }}
Typy instalacji:
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'); }
źródło
.d.ts
pliki i utworzyłemtypeRoots
tablicę w moimcompilerOptions
, nie określiłemnode_modules/@types
i to właśnie spowodowało błąd. Po dodaniu tego dotypeRoots
tablicy znów zadziałało.Maszynopis wie o modułach opartych na konwencjach, sprawdź Rozdzielczość modułu aby uzyskać więcej szczegółów.
Również dla IDE
fs
module, musisz podać typy dla node.Sprawdź również ten problem na githubie
źródło