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

Posted

技术标签:

【中文标题】如何使用 TypeScript 在 VS Code 中找到模块“fs”?【英文标题】:How to find module "fs" in VS Code with TypeScript? 【发布时间】:2016-09-12 15:43:23 【问题描述】:

我在 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执行这段代码? 计划是用node执行,是的。当前应用程序可以访问本地文件。 @peteb 【参考方案1】:

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【参考方案2】:

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

TypeScript 2.0+

使用 npm 安装:

npm install --save-dev @types/node

TypeScript

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

typings install dt~node --global --save

或者,如果您使用的是

typings install node --ambient --save

或者,如果一切都失败了,手动下载文件here 并将其包含在您的项目中。

【讨论】:

我使用了您在编辑之前使用的命令,并且成功了。 (typings install node --ambient --save) 谢谢! @Brick 是的,这会起作用。答案中的命令是针对刚刚发布的typings 1.0 这个已经过时了,现在的类型通常应该用npm安装,如Abe's answer below。 带纱:yarn add @types/node --dev 安装@types/node后,可能需要重启Code才能正确识别模块。这应该只适用于本机节点模块,根据您的代码构建,甚至可能对您来说不是问题。【参考方案3】:

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


【讨论】:

【参考方案4】:

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


  "compilerOptions": 
      ...
      "moduleResolution": "node"
      ...
  

执行

npm install @types/node --save-dev

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

import * as fs from "fs";

【讨论】:

试过但仍然遇到同样的问题 @pardeepjain,你有旧的打字稿吗?使用vscode?检查状态栏上的 Typescript 版本。【参考方案5】:

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

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

也可以查看github issue

【讨论】:

【参考方案6】:

"fs" 是一个核心 Node 模块,我认为你的 import 语句语法有点不对劲。试试:

import * as fs from "fs";

【讨论】:

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

以上是关于如何使用 TypeScript 在 VS Code 中找到模块“fs”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio Code (VS Code) 上调试用 Typescript 编写的 Express 应用程序

如何安装 TypeScript 定义文件,以便始终由 VS Code 加载?

如何在 VS Code 中使用 Typescript 定义为我自己的 Javascript 服务获取 Intellisense?

如何在 VS Code / TypeScript 中禁用多余的自动导入建议?

使用 VS Code 调试在 Docker 容器中使用 ts-node 运行的 TypeScript 应用程序时,如何能够正确设置断点?

如何在 VS Code 中为模板中的 vue 道具启用 Typescript 打字和智能感知?