javascript - Hur hittar man modulen "fs" i VS Code med TypeScript?


Jag kör på en MacBook Air. Jag har installerat VS Code som IDE och har också TypeScript installerat.

Jag har en enkel fil med bara den här raden:

import fs = require('fs');

Jag får en röd vågig linje under 'fs' inom parentesen och felmeddelandet är [ts] Kan inte hitta modul 'fs'. Filen har en .ts-tillägg. Jag är ny på JavaScript och TypeScript, men jag hade uppfattningen att fs var en kärnmodul, så hur kan den inte hittas? Hur fixar jag problemet?

Andra saker som jag redan har provat:

  • Att lägga en enkel funktionskropp i filen och sedan kompilera på kommandoraden med tsc. Jag får i princip ett motsvarande fel där: error TS2307: Cannot find module 'fs'.
  • På kommandoraden sudo npm install fs -g. Detta rapporterar uppenbar framgång, men löser inte problemet.

Jag rotade runt på SE och på webben, men de svar som verkade nära verkar alla anta att 'fs' är tillgängligt.

Svar #1

Du behöver inkludera definitionsfilen för node.

TypeScript 2.0+

Installera med npm:

npm install --save-dev @types/node

TypeScript < 2.0

Om du använder typer kan du köra detta kommando:

typings install dt~node --global --save

Eller om du använder typings < 1.0, kör:

typings install node --ambient --save

Eller om allt annat misslyckas, ladda ner filen manuellt här och inkludera den i ditt projekt.

Svar #2

Det finns ett bättre sätt nu utan att gå till de tidigare tsd- eller typings-verktygen. NPM har nu @types-paketet för TypeScript. I detta exempel behöver du paketet @types/node:

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

Se till att du använder alternativet save-dev för att endast installera typerna i utvecklingsläge, inte i produktion. Du bör ha de senaste Node-biblioteken när du använder npm install "@types/"-syntaxen...

Det hittar inte fs-paketet eftersom de tidigare verktygens typdefinitioner sannolikt inte använder den senaste node.d.ts-definitionsfilen.

Din tsconfig.json-fil behöver uppdateras för att hitta dessa typ-paket. Mitt exempel använder jquery, jqueryui och node-typer. Förutsatt att du behöver att syntaksen ska fungera för din kodredigerare också, i det här fallet 'atom'-kodredigeraren.

{
"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
}
}

Svar #3

"fs" är en kärnmodul i Node och jag tror att din import-syntax är lite fel. Prova:

import * as fs from "fs";

Svar #4

Allt du behöver är att sätta "moduleResolution" till "node" i din tsconfig.json:

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

utföra

npm install @types/node --save-dev

och nu kan du använda standard TypeScript-import:

import * as fs from "fs";

Svar #5

Du har tre alternativ i tsconfig.json (här: Node 11+), se dokumentation:

Ange antingen både typeRoots och types, endast typeRoots eller ta bort båda raderna helt (rekommenderas):

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

Installera typer:

npm install --save-dev @types/node

Använd filsystem baserat på löften (t.ex. för att använda async/await):

import {promises as fs} from 'fs';

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

Relaterade artiklar