如何用TypeScript在VS代码中找到模块“fs”?

btxsgosb  于 2023-02-17  发布在  TypeScript
关注(0)|答案(8)|浏览(181)

我在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和Web上四处打听,但看起来很接近的答案似乎都假设“fs”是可用的。

vu8f3i0k

vu8f3i0k1#

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

    • 类型脚本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并将其包含在项目中。

3okqufwl

3okqufwl2#

现在有一个更好的方法,不用使用以前的tsd或typings工具,NPM现在有@types包用于typescript,在这个例子中,你需要@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
}
}
igsr9ssn

igsr9ssn3#

“fs”是一个核心节点模块,我认为您的import语句语法有点错误。

import * as fs from "fs";
zynd9foi

zynd9foi4#

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

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

执行

npm install @types/node --save-dev

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

import * as fs from "fs";
iszxjhcz

iszxjhcz5#

tsconfig.json中有三个选项(此处为:节点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');
}
wbgh16ku

wbgh16ku6#

Typescript根据约定了解模块,请查看Module resolution以了解更多详细信息。
此外,IDE要了解fs模块,还必须提供节点的类型。
还要检查此github issue

6rvt4ljy

6rvt4ljy7#

在我这边这项工作

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

对于具有vitej的nwj

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

这将删除any

mccptt67

mccptt678#

如果您的文件(脚本)位于以.开头的目录中,您也会得到此类错误https://github.com/microsoft/TypeScript/issues/13399
我有同样的问题(Cannot find module 'fs' or its corresponding type declarations.),虽然@types/node已安装。我的脚本是在.husky目录和添加:

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

tsconfig.json解决了这个问题。

相关问题