Як знайти модуль “fs” у коді VS за допомогою TypeScript?


83

Я працюю на MacBook Air. Я встановив код VS як 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?
петеб

План полягає в тому, щоб виконати його за допомогою node, так. Локальний доступ до файлу є нормальним для поточної програми. @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 так, це спрацює. Команда у відповіді стосується набору 1.0, який щойно вийшов
Девід Шеррет,

Це застаріло, типи днів зазвичай слід встановлювати з npm, як у відповіді Абе нижче .
dshepherd 02

З пряжею:yarn add @types/node --dev
Джонатан Н

Після встановлення @types/nodeвам може знадобитися перезапустити код, щоб він розпізнав модулі належним чином. Це має бути лише у випадку з рідними модулями вузлів, і це може навіть не бути проблемою для вас, залежно від вашої збірки коду.
Дон

50

Зараз є кращий спосіб, не переходячи до попередніх інструментів tsd або набору тексту. NPM тепер має пакет @types для typecript. У цьому прикладі вам потрібен пакет @types/node:

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

Переконайтеся, що ви використовуєте опцію save-dev, щоб встановлювати типи лише в режимі розробки, а не у виробничій. Ви повинні мати найновіші бібліотеки вузлів при використанні синтаксису npm install "@ types /" ...

Він не знаходить пакета fs, оскільки попередні типи інструментів, швидше за все, не використовують останній файл визначення node.d.ts.

Ваш файл tsconfig.json потрібно оновити, щоб знайти ці типи пакунків. Мій приклад, якщо використовуються типи jquery, jqueryui та node. Припускаючи, що вам потрібен синтаксис для роботи з вашим редактором коду, в даному випадку редактором коду '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" - це основний модуль Node, і я думаю, що ваш синтаксис оператора імпорту трохи відхилений. Спробуйте:

import * as fs from "fs";

А, типізація для Node не включена. Спробуйте додати цей файл та посилальний шлях до нього: github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/…
Eric N

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

Так, друкувати потрібно. Вузол не пишеться в Typescript, тому він не має даних про тип, які шукає Typescript. Файл визначення надає всі дані цього типу для вас.
Eric N

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(тут: Вузол 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.