如何使用 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”?的主要内容,如果未能解决你的问题,请参考以下文章