ChatGPT解决这个技术问题 Extra ChatGPT

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

我在 MacBook Air 上运行。我将 VS Code 安装为 IDE,还安装了 TypeScript。

我有一个简单的文件,只有这一行:

import fs = require('fs');

我在括号内的“fs”下得到一个红色波浪线,错误消息是 [ts] Cannot find module 'fs'. 该文件具有 .ts 扩展名。我是 JavaScript 和 TypeScript 的新手,但我的印象是 fs 是一个核心模块,所以怎么找不到呢?我该如何解决这个问题?

我已经尝试过的其他事情:

将一个简单的函数体放入文件中,然后使用 tsc 在命令行上编译。我在那里得到一个基本相同的错误:错误 TS2307:找不到模块“fs”。

在命令行上 sudo npm install fs -g。这报告了明显的成功,但并没有解决问题。

我浏览了 SE 和网络,但似乎很接近的答案似乎都假设“fs”是可用的。

您确定要使用 node 执行此代码吗?
计划是用节点执行它,是的。当前应用程序可以访问本地文件。 @peteb

D
David Sherret

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

打字稿 2.0+

使用 npm 安装:

npm install --save-dev @types/node

打字稿 < 2.0

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

typings install dt~node --global --save

或者,如果您使用类型 < 1.0 运行:

typings install node --ambient --save

或者,如果所有其他方法都失败了,请手动下载文件 here 并将其包含在您的项目中。


我使用了您在编辑之前使用的命令,并且成功了。 (typings install node --ambient --save) 谢谢!
@Brick 是的,这会起作用。答案中的命令是针对刚刚发布的typings 1.0
使用纱线:yarn add @types/node --dev
试过了。但仍然没有为我工作。仍然获得 Error: Can't resolve 'fs' 的任何其他原因?
@barath您找到解决方案了吗?我也有这个错误。
d
dshepherd

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

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

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

它没有找到 fs 包,因为以前的工具类型很可能没有使用最新的 node.d.ts 定义文件。

您的 tsconfig.json 文件需要更新才能找到这些类型的包。如果使用 jquery、jqueryui 和节点类型,我的示例。假设您的代码编辑器也需要语法,在这种情况下是“原子”代码编辑器

{
"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
}
}

E
Eric N

“fs”是一个核心节点模块,我认为您的导入语句语法有点偏离。尝试:

import * as fs from "fs";

啊,不包括 Node 的类型。尝试添加此文件及其引用路径:github.com/DefinitelyTyped/DefinitelyTyped/blob/master/node/…
@EricN该页面导致404。即使模块是整个NodeJs核心的一部分,也需要输入?
是的,打字是必要的。 Node 不是用 Typescript 编写的,因此它没有 Typescript 查找的任何类型数据。定义文件为您提供所有类型数据。
B
Brick

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

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

执行

npm install @types/node --save-dev

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

import * as fs from "fs";

试过但仍然遇到同样的问题
@pardeepjain,你有旧打字稿的机会吗?使用vscode?检查状态栏上的 Typescript 版本。
我只需要第一部分 - 我有一个不需要 packages.json 文件的小脚本
U
User Rebo

您在 tsconfig.json 中有三个选项(此处:节点 11+),请参阅 docs

指定 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 数组中,它就会再次起作用。
优秀的答案。与这里 90% 的人不同,我已经安装了 node 类型,但遇到了核心 node 模块的问题(例如在 运行时 找不到的 os
M
Madhu Ranjan

Typescript 了解基于约定的模块,请查看 Module resolution 了解更多详细信息。

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

另请检查此github issue


j
jon

在我这边,这项工作

 const fs = require('fs') as typeof import('fs');

对于 nwjs 和 vitejs

 const fs = nw.require('fs') as typeof import('fs');

这将删除 any