Как найти модуль «fs» в VS Code с TypeScript?


83

Я использую MacBook Air. Я установил VS Code как IDE, а также установил TypeScript.

У меня есть простой файл с этой строкой:

import fs = require('fs');

Под «fs» внутри круглых скобок появляется красная волнистая линия, и появляется сообщение об ошибке [ts] Cannot find module 'fs'.. Файл имеет расширение .ts. Я новичок в JavaScript и TypeScript, но у меня сложилось впечатление, что fsэто базовый модуль, так как же его не найти? Как решить проблему?

Другие вещи, которые я уже пробовал:

  • Помещение тела простой функции в файл, а затем компиляция в командной строке с помощью tsc. Я получаю там эквивалентную ошибку:error TS2307: Cannot find module 'fs'.
  • В командной строке sudo npm install fs -g. Это сообщает об очевидном успехе, но не решает проблему.

Я покопался в SE и в Интернете, но все ответы, которые казались близкими, похоже, предполагают, что 'fs' доступен.


Вы определенно выполняете этот код с помощью node?
Peteb

Планируется выполнить это с помощью узла, да. Доступ к локальным файлам разрешен для текущего приложения. @peteb
Brick

Ответы:


96

Вам необходимо включить файл определения для узла.

TypeScript 2.0+

Установить с помощью npm:

npm install --save-dev @types/node

TypeScript <2.0

Если вы используете набор текста, вы можете запустить эту команду:

typings install dt~node --global --save

Или, если вы используете типизацию <1.0, запустите:

typings install node --ambient --save

Или, если ничего не помогает, вручную загрузите файл сюда и включите его в свой проект.


1
Я использовал команду, которая была у вас до редактирования, и это помогло. ( typings install node --ambient --save) Спасибо!
Brick

@Brick да, это сработает. Команда в ответе предназначена для набора 1.0, который только что был выпущен
Дэвид Шеррет

Это устарело, в наши дни типы обычно следует устанавливать с помощью npm, как в ответе Абэ ниже .
dshepherd 02

С пряжей:yarn add @types/node --dev
Jonathan H

После установки @types/nodeвам может потребоваться перезапустить Code, чтобы он правильно распознал модули. Это должно относиться только к модулям собственных узлов и может даже не быть проблемой для вас, в зависимости от вашей сборки кода.
Дон

50

Теперь есть лучший способ, не переходя к предыдущему tsd или инструментам ввода. NPM теперь имеет пакет @types для машинописного текста. В этом примере вам понадобится пакет @types/node:

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

Убедитесь, что вы используете опцию save-dev, чтобы устанавливать типы только в режиме разработки, а не в производственной среде. При использовании синтаксиса npm install "@ types /" у вас должны быть новейшие библиотеки узлов ...

Пакет fs не найден, потому что предыдущие инструменты, скорее всего, не использовали последний файл определения node.d.ts.

Ваш файл tsconfig.json необходимо обновить, чтобы найти пакеты этих типов. Мой пример при использовании типов jquery, jqueryui и node. Предполагая, что вам нужен синтаксис для работы и для вашего редактора кода, в данном случае редактор кода атома

{
"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" - это базовый модуль узла, и я думаю, что синтаксис вашего оператора импорта немного неправильный. Пытаться:

import * as fs from "fs";

Ах, типизация для Node не включена. Попробуйте добавить этот файл и ссылочный путь к нему: github.com/DefinentyTyped/DefinentyTyped/blob/master/node/…
Эрик Н.

1
@EricN Страница ведет к ошибке 404. Типизация необходима, даже если модуль является частью всего ядра NodeJs?
Jacks

Да, печатать надо. Node не написан на Typescript, поэтому в нем нет данных типа, которые ищет Typescript. Файл определения предоставляет вам все данные этого типа.
Эрик Н.

21

Все, что вам нужно, это установить для "moduleResolution" значение "node" в вашем tsconfig.json:

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

выполнять

npm install @types/node --save-dev

и теперь вы можете использовать стандартный импорт TypeScript:

import * as fs from "fs";

Пытался, но проблема не
исчезла

1
@pardeepjain, есть ли у вас старый машинописный текст? Используете vscode? Проверьте версию Typescript в строке состояния.
yrtimiD

4

У вас есть три варианта tsconfig.json(здесь: Node 11+), см. Документы :

Либо укажите оба typeRootsи types, typeRootsлибо полностью удалите обе строки (рекомендуется):

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

Типы установки:

npm install --save-dev @types/node

Используйте файловую систему на основе обещаний (например, для использования async / await):

import {promises as fs} from 'fs';

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

Когда я создал папку объявлений для размещения моих .d.tsфайлов и создал typeRootsмассив в моем, compilerOptionsя не указал, node_modules/@typesи это вызвало у меня ошибку. Как только я добавил это в typeRootsмассив, он снова заработал.
str8up7od 07

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.