我在 MacBook Air 上运行。我将 VS Code 安装为 IDE,还安装了 TypeScript。
我有一个简单的文件,只有这一行:
import fs = require('fs');
我在括号内的“fs”下得到一个红色波浪线,错误消息是 [ts] Cannot find module 'fs'.
该文件具有 .ts 扩展名。我是 JavaScript 和 TypeScript 的新手,但我的印象是 fs
是一个核心模块,所以怎么找不到呢?我该如何解决这个问题?
我已经尝试过的其他事情:
将一个简单的函数体放入文件中,然后使用 tsc 在命令行上编译。我在那里得到一个基本相同的错误:错误 TS2307:找不到模块“fs”。
在命令行上 sudo npm install fs -g。这报告了明显的成功,但并没有解决问题。
我浏览了 SE 和网络,但似乎很接近的答案似乎都假设“fs”是可用的。
node
执行此代码吗?
现在有一种更好的方法,无需使用以前的 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
}
}
“fs”是一个核心节点模块,我认为您的导入语句语法有点偏离。尝试:
import * as fs from "fs";
您只需要在 tsconfig.json 中将“moduleResolution”设置为“node”:
{
"compilerOptions": {
...
"moduleResolution": "node"
...
}
}
执行
npm install @types/node --save-dev
现在您可以使用标准的 TypeScript 导入:
import * as fs from "fs";
您在 tsconfig.json
中有三个选项(此处:节点 11+),请参阅 docs:
指定 typeRoots
和 types
,仅 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
数组中,它就会再次起作用。
node
类型,但遇到了核心 node
模块的问题(例如在 运行时 找不到的 os
)
Typescript 了解基于约定的模块,请查看 Module resolution 了解更多详细信息。
此外,为了让 IDE 了解 fs
模块,您必须为节点提供类型。
另请检查此github issue
在我这边,这项工作
const fs = require('fs') as typeof import('fs');
对于 nwjs 和 vitejs
const fs = nw.require('fs') as typeof import('fs');
这将删除 any
typings install node --ambient --save
) 谢谢!yarn add @types/node --dev
Error: Can't resolve 'fs'
的任何其他原因?