如何使用TypeScript在VS Code中找到模块“ fs”?


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 '16

计划是使用节点执行它,是的。当前应用程序可以进行本地文件访问。@peteb

Answers:


95

您需要包括节点的定义文件。

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是的,它将起作用。答案中的命令适用于刚刚发布的
键入

这已经过时,这些天类型通常应该与npm一起安装,如下面的安倍晋三的回答
dshepherd '18

含纱线:yarn add @types/node --dev
Jonathan H

安装后@types/node,您可能需要重新启动Code才能正确识别模块。这仅适用于本机节点模块,对于您甚至可能不是问题,这取决于您的代码构建。

50

现在有一种更好的方法,而无需使用以前的tsd或打字工具。NPM现在具有用于typescript的@types包。在此示例中,您需要包装@types/node

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

确保使用save-dev选项仅在开发模式下安装类型,而不在生产模式下安装类型。使用npm install“ @ types /”语法时,应该具有最新的节点库...

它找不到fs软件包,因为先前的工具键入很可能不使用最新的node.d.ts定义文件。

您的tsconfig.json文件需要更新才能找到这些类型的程序包。我的示例是否使用jquery,jqueryui和节点类型。假设您还需要语法也可用于代码编辑器,在本例中为“ 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语句语法有些偏离。尝试:

import * as fs from "fs";

啊,不包括Node的类型。尝试添加该文件和参考路径设置为:github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/...
埃里克ñ

1
@EricN页面指向404。即使模块是整个NodeJs核心的一部分,也需要键入文字?
杰克斯

是的,必须输入。Node不是用Typescript编写的,因此它没有Typescript查找的任何类型数据。定义文件为您提供所有类型的数据。
Eric N

21

您只需要在tsconfig.json中将“ moduleResolution”设置为“ node”即可:

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

执行

npm install @types/node --save-dev

现在您可以使用标准的TypeScript导入:

import * as fs from "fs";

尝试过但仍遇到相同问题
Pardeep Jain

1
@pardeepjain,有没有机会使用旧打字稿?使用vscode?在状态栏上检查Typescript版本。
yrtimiD

4

您可以在中找到三个选项tsconfig.json(此处:Node 11+),请参阅docs

任一specifiy两个typeRootstypes,仅typeRoots删除完全两条线(推荐):

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

安装类型:

npm install --save-dev @types/node

使用基于承诺的文件系统(例如,使用异步/等待):

import {promises as fs} from 'fs';

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

当我创建一个声明文件夹以放入.d.ts文件并在其中创建一个typeRoots数组时,我compilerOptions没有指定node_modules/@types,这就是导致我出错的原因。将其添加到typeRoots阵列后,它又可以工作了。
str8up7od

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.