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

问题描述 投票:0回答:9

我在 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”可用。

javascript typescript tsc
9个回答
158
投票

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

TypeScript 2.0+

使用 npm 安装:

npm install --save-dev @types/node

打字稿< 2.0

如果你使用 typings 那么你可以运行这个命令:

typings install dt~node --global --save

或者如果你正在使用打字< 1.0 run:

typings install node --ambient --save

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


60
投票

现在有一种更好的方法,无需使用以前的 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
}
}

41
投票

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

import * as fs from "fs";

28
投票

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

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

执行

npm install @types/node --save-dev

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

import * as fs from "fs";

13
投票

您在

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

要么specifiy

typeRoots
types
,只有
typeRoots
remove完全(推荐):

{"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');
}

2
投票

Typescript 知道基于约定的模块,查看 Module resolution 了解更多细节。

为了让 IDE 了解

fs
模块,您必须为节点提供类型。

还要检查这个github问题


0
投票

我这边的工作

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

for nwjs 与 vitejs

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

这删除了

any


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"]
后,错误修复。

© www.soinside.com 2019 - 2024. All rights reserved.