如何找到模块" fs"在使用TypeScript的MS Code中?

时间:2016-05-16 18:36:03

标签: javascript typescript tsc

我在MacBook Air上运行。我安装了MS Code作为IDE并安装了TypeScript。

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

import fs = require('fs');

我在“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'是可用的。

6 个答案:

答案 0 :(得分:49)

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

TypeScript 2.0 +

使用npm安装:

npm install --save-dev @types/node

TypeScript< 2.0

如果您使用typings,则可以运行此命令:

typings install dt~node --global --save

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

typings install node --ambient --save

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

答案 1 :(得分:42)

现在有一种更好的方法,无需使用以前的tsd或打字工具。 NPM现在有了打字稿的@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
}
}

答案 2 :(得分:16)

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

import * as fs from "fs";

答案 3 :(得分:12)

你需要的只是" moduleResolution"设置为"节点"在你的tsconfig.json中:

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

执行

npm install @types/node --save-dev

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

import * as fs from "fs";

答案 4 :(得分:4)

tsconfig.json中有三个选项(此处为节点11+),请参见blog post

指定 typeRootstypes,仅typeRoots删除这两行都行(推荐):

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

答案 5 :(得分:2)

Typescript根据约定了解模块,请查看Module resolution以获取更多详细信息。

同样,要让IDE了解fs模块,您必须为节点提供输入。

同时检查此github issue