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

133
我正在使用 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
计划使用Node执行它,是的。对于当前应用程序,本地文件访问是可以的。@peteb - Brick
12个回答

167

你需要引入 Node 的定义文件。

TypeScript 2.0+

使用 npm 安装:

npm install --save-dev @types/node

类型化的 JavaScript < 2.0

如果您使用 typings,则可以运行以下命令:

typings install dt~node --global --save

如果您使用的是 typings < 1.0,请输入以下命令:

typings install node --ambient --save

如果其他方法都不起作用,那么请手动下载文件这里,并将其包含在您的项目中。


1
我使用了你在编辑之前的命令,这解决了问题。(typings install node --ambient --save)谢谢! - Brick
这已经过时了,现在通常应该使用npm来安装类型,就像Abe在下面的回答中所说的那样 - dshepherd
1
使用 yarn:yarn add @types/node --dev - Jonathan H
2
尝试过了,但对我仍然没有用。还有其他原因导致仍然出现“错误:无法解析'fs'”吗? - barath
2
@barath,你找到解决方案了吗?我也遇到了这个错误。 - Vidy Videni
显示剩余3条评论

63

现在有一种更好的方法,无需使用以前的tsd或typings工具。NPM现在拥有typescript的@types软件包。在这个例子中,您需要安装@types/node软件包:

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

确保你在使用save-dev选项来仅在开发模式下安装类型,而不是在生产模式下。当你使用npm install "@types/"语法时,你需要有最新的node库...

它找不到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
}
}

43

"fs"是Node的核心模块,我认为你的导入语句语法有点不对。请尝试:

import * as fs from "fs";

啊,Node的类型定义文件没有包含在内。尝试添加这个文件并引用它:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/node.d.ts - Eric N
2
@EricN 该页面显示404错误。即使模块是Node.js核心的一部分,仍然需要类型声明吗? - Jacks
是的,类型定义是必要的。Node.js并没有使用TypeScript编写,因此它没有任何TypeScript所需的类型数据。类型定义文件为您提供了所有这些类型数据。 - Eric N

29

你只需要在tsconfig.json中将"moduleResolution"设置为"node":

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

执行

npm install @types/node --save-dev

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

import * as fs from "fs";

3
尝试过了,但仍然遇到相同的问题。 - Pardeep Jain
1
@pardeepjain,你有旧的TypeScript版本吗?正在使用VSCode吗?请在状态栏中检查TypeScript版本。 - yrtimiD
我只需要这个的第一部分 - 我有一个微小的脚本,_不需要_一个packages.json文件。 - Ian Grainger

16
你在tsconfig.json(这里是 Node 11+)中有三个选择, 参见文档

要么同时指定typeRootstypes, 要么只指定typeRoots, 或者完全删除这两行(建议):

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

安装类型:

npm install --save-dev @types/node

使用基于 Promise 的文件系统(例如使用 async / await):

import {promises as fs} from 'fs';

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

当我创建了一个声明文件夹来放置我的.d.ts文件,并在我的compilerOptions中创建了一个typeRoots数组时,我没有指定node_modules/@types,这就是导致错误的原因。一旦我将其添加到typeRoots数组中,它就可以正常工作了。 - str8up7od
非常好的回答。与这里90%的人不同,我已经安装了node类型,但遇到了核心node模块(如os运行时无法找到)的问题。 - Robert
谢谢。我在我的tsconfig:compilerOptions中漏掉了types:["node"] - John Hatton

2

Typescript了解基于约定的模块,有关更多详细信息,请查看模块解析

此外,为了让IDE了解fs模块,您必须提供节点的类型定义。

还要检查这个github问题


1

如果您已安装@types/node包,但仍然出现TS错误,请尝试以下操作:

  1. tsconfig.json中将"node"添加到"compileOptions" "types"

例如:

"compileOptions": {
    "types": ["node"]
}

2.此外,在tsconfig.app.jsoncompilerOptions “types”中添加"node" 3.保存所有更改并通过以下方式重新启动TS服务器
  • MacCmd + Shift + P
  • WinCtrl + Shift + P

enter image description here


0

如果你的文件(脚本)在以.开头的目录中,你也可能会遇到这种错误:https://github.com/microsoft/TypeScript/issues/13399

我曾经遇到过完全相同的问题(Cannot find module 'fs' or its corresponding type declarations.),尽管已经安装了@types/node。我的脚本在.husky目录中,添加以下内容:

    "include": [
        "./**/*",
        "./.husky/**/*",
    ],

tsconfig.json返回解决了问题。


0

检查你的 tsconfig.json 文件,看看是否有错误的 include 设置

我遇到了这个问题,因为我的 tsconfig.json 文件指定了一个 include 列表,但该列表没有包括我出现错误的文件。换句话说,TypeScript 没有正确处理该文件。

在我的情况下,我的 include 设置为 ["src"],但我的文件位于名为 scripts 的子目录中。调整 include["scripts", "src"] 后,错误得到了修复。


0

除了检查 tsconfig.json 中的 "types": ["node"] 设置内容外,您可能还想在 tsconfig.app.json(如果有)中查找相同的内容。


2
嘿@wmm2!很高兴你能加入社区!当你在回答中放置代码时,你可以通过选择文本并按下“Ctrl”+“K”来使其更易读。 - Robert Bradley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接