¿Cómo encontrar el módulo "fs" en VS Code con TypeScript?


83

Estoy usando una MacBook Air. Instalé VS Code como un IDE y también tengo TypeScript instalado.

Tengo un archivo simple con solo esta línea:

import fs = require('fs');

Aparece un ondulado rojo debajo de la 'fs' dentro del paréntesis y el mensaje de error es [ts] Cannot find module 'fs'.El archivo tiene una extensión .ts. Soy nuevo en JavaScript y TypeScript, pero tenía la impresión de que fsera un módulo principal, entonces, ¿cómo no se podía encontrar? ¿Cómo soluciono el problema?

Otras cosas que ya probé:

  • Poner un cuerpo de función simple en el archivo y luego compilarlo en la línea de comando con tsc. Recibo un error esencialmente equivalente allí:error TS2307: Cannot find module 'fs'.
  • En la línea de comando sudo npm install fs -g. Esto informa un éxito aparente, pero no soluciona el problema.

Revisé SE y la web, pero las respuestas que parecían cercanas parecen asumir que 'fs' está disponible.


Definitivamente estás ejecutando este código con node?
peteb

El plan es ejecutarlo con nodo, sí. El acceso a archivos locales está bien para la aplicación actual. @peteb
Brick

Respuestas:


95

Debe incluir el archivo de definición para node.

TypeScript 2.0+

Instalar usando npm:

npm install --save-dev @types/node

TypeScript <2.0

Si usa mecanografía , puede ejecutar este comando:

typings install dt~node --global --save

O si está utilizando typings <1.0 ejecute:

typings install node --ambient --save

O si todo lo demás falla, descargue manualmente el archivo aquí e inclúyalo en su proyecto.


1
Usé el comando que tenías antes de tu edición, y eso funcionó. ( typings install node --ambient --save) ¡Gracias!
Brick

@Brick sí, eso funcionará. El comando en la respuesta es para typings 1.0 que se acaba de lanzar
David Sherret

Esto está desactualizado, en estos días los tipos generalmente deben instalarse con npm, como en la respuesta de Abe a continuación .
dshepherd

Con hilo:yarn add @types/node --dev
Jonathan H

Después de la instalación @types/node, es posible que deba reiniciar Code para que reconozca los módulos correctamente. Este solo debería ser el caso con los módulos de nodo nativo, y puede que ni siquiera sea un problema para usted dependiendo de su compilación de código.
Don

50

Ahora hay una mejor manera sin tener que ir a las herramientas tsd o de mecanografía anteriores. NPM ahora tiene el paquete @types para mecanografiado. En este ejemplo, necesita el paquete @types/node:

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

Asegúrese de que está utilizando la opción save-dev para instalar solo los tipos en modo de desarrollo, no en producción. Debería tener las últimas bibliotecas de nodos cuando utilice la sintaxis npm install "@ types /" ...

No encuentra el paquete fs porque lo más probable es que las herramientas anteriores no utilicen el último archivo de definición node.d.ts.

Su archivo tsconfig.json debe actualizarse para encontrar estos paquetes de tipo. Mi ejemplo si uso jquery, jqueryui y tipos de nodo. Suponiendo que también necesita la sintaxis para su editor de código, en este caso, el editor de código '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" es un módulo de nodo principal y creo que la sintaxis de la declaración de importación está un poco fuera de lugar. Tratar:

import * as fs from "fs";

Ah, las mecanografías para Node no están incluidas. Intente agregar este archivo y una ruta de referencia: github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/…
Eric N

1
@EricN La página conduce a un 404. ¿Se necesitan tipificaciones incluso si el módulo es parte de todo el núcleo de NodeJs?
Jacks

Sí, la escritura es necesaria. El nodo no está escrito en TypeScript, por lo que no tiene ninguno de los datos de tipo que busca Typescript. El archivo de definición le proporciona todos los datos de ese tipo.
Eric N

21

Todo lo que necesita es "moduleResolution" establecido en "node" en su tsconfig.json:

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

ejecutar

npm install @types/node --save-dev

y ahora puede utilizar la importación estándar de TypeScript:

import * as fs from "fs";

Intenté pero todavía
tengo el

1
@pardeepjain, ¿alguna posibilidad de que tenga un texto mecanografiado antiguo? ¿Estás usando vscode? Verifique la versión de TypeScript en la barra de estado.
yrtimiD

4

Tiene tres opciones en tsconfig.json(aquí: Nodo 11+), consulte los documentos :

De cualquier specifiy tanto typeRootsy typessolamente, typeRootso eliminar ambas líneas por completo (recomendado):

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

Tipos de instalación:

npm install --save-dev @types/node

Use un sistema de archivos basado en promesas (por ejemplo, para usar async / await):

import {promises as fs} from 'fs';

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

Cuando creé una carpeta de declaraciones para colocar mis .d.tsarchivos y creé una typeRootsmatriz en mi, compilerOptionsno había especificado node_modules/@typesy eso es lo que me causó el error. Una vez que agregué eso a la typeRootsmatriz, funcionó nuevamente.
str8up7od

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.