遇到错误 TS2304: 找不到名称为 'Buffer' 的内容。

60

我正在尝试使用TypeScript在NodeJS中进行base64编码。

以下代码在JavaScript中可以正常工作。

当我在TypeScript中编写相同的代码并进行编译时,我会得到“Buffer未找到”错误。

var base64Policy = new Buffer(stringPolicy, 'utf-8').toString('base64');

有人能帮我用TypeScript做同样的事情吗?

8个回答

66

对于IONIC 4开发人员,我是使用以下方式安装的

npm install --save @types/node

当我尝试添加如下所示的"types": ["node"]

"compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": ["node"]
},

对于

tsconfig.json

它没有生效。我不得不将条目添加到

tsconfig.app.json

请参考以下链接获取相关文档。
https://github.com/aws/aws-sdk-js/issues/1271#issuecomment-291658668

如果这对您有用,请告诉我!


4
好的,这在 Angular 12 应用程序中行不通。安装了类型,添加到 tsconfig.app.json,但在浏览器控制台仍然看到“Buffer is not defined”:/ - danwellman
@danwellman 如果你找到了解决方案,能否在这里提供一下呢? :D - Neyt
Node的Buffer类在浏览器环境下不存在,因此Web前端需要采用不同的方法。这个答案中描述了一种方法:https://dev59.com/9lkT5IYBdhLWcg3wPtIv#72540058 - Cameron Hudson

60

在顶部添加这一行:

declare const Buffer

它应该可以无错误编译。

声明是使用节点内置库或其他全局对象所必需的,您可以像上面那样手动声明它。

在新版本的Typescript中,您还可以使用官方声明文件:

npm i -g typescript@next
npm i --save-dev @types/node

对于其他库,请安装@types/library_name

更多详情请参见:提高声明文件获取率声明文件的未来


5
我认为这个很合适 - npm i --save-dev @types/node。这是开发时的依赖! - Keerthivasan

30

序言

BufferNode.js API 的一部分。由于 TypeScript 默认不知道来自 Node.js 的类,因此您需要安装 声明文件 (类型定义)以针对 Node.js 进行编译。

如果您看到以下错误,则需要手动安装类型定义:

error TS2304: Cannot find name 'Buffer'.

安装类型定义

您可以使用 typings 工具安装类型定义。我将向您展示如何执行此操作:

  1. 使用 npm 安装 typings 工具:

    npm install -g typings

  2. DefinitelyTyped~dt)存储库中安装 Node.js 的类型定义:

    typings install dt~node --global --save

typings 工具将创建以下目录 "typings/globals/node" 并在 "typings/index.d.ts" 中进行链接。还会有一个名为 typings.json 的文件(因为使用了 --save 选项),该文件引用已解析的类型定义:

{
  "globalDependencies": {
    "node": "registry:dt/node#6.0.0+20160621231320"
  }
}

注意:如果您看到错误“typings\globals\node\index.d.ts(71,26):error TS1110:Type expected”,则您的Node.js定义过于最新。 typings 工具与最新的类型声明存在问题。在这种情况下,只需检查typings.json文件中的版本。对我来说,node#6.0.0+20160621231320可用,但node#6.0.0+20161212163245不可用。

  1. 现在,您只需要将 index.d.ts 添加为一个三斜杠指令 到使用Buffer 类的代码中:

YourClass.ts

/// <reference path="../../typings/index.d.ts" />

export class YourClass {

  private static toString(encoded: string): string {
    return new Buffer(encoded, "base64").toString();
  }

}

更新:

随着TypeScript 2.0的发布,已经宣布了一个新的类型定义系统。

您现在可以忘记typings工具了。您只需运行此命令来安装Node.js的TypeScript定义

npm install --save @types/node

请确保您的tsconfig.json中有以下条目:

{
  "compilerOptions": {
    "moduleResolution": "node",
    ...
  },
  "exclude": [
    "node_modules",
    ...
  ]
}

顺便提一句,如果你需要其他类的类型定义(不在Node.js中包含的),你可以在这里搜索:http://microsoft.github.io/TypeSearch/


我已经为此奋斗了几天,这是我第一次看到一个真正能在Windows 10环境下运行的解决方案。谢谢! - JasonPerr
{btsdaf} - JasonPerr

20

对于Angular用户:

  1. 运行以下命令:

npm install --save @types/node

  1. 在你的tsconfig.app.json文件中,将以下两行添加到CompilerOptions中:
"compilerOptions": {
    //...
    "types": ["node"],
    "typeRoots": ["node_modules/@types"]
  }

这对我有用,但是这些指示是如何解决问题的? - undefined

17

缓冲区(Buffer)来自于Node命名空间。 首先安装:

npm install --save @types/node

然后在您的tsconfig.json文件中,在compilerOptions部分内添加以下代码:

"types": ["node"],
"typeRoots": ["node_modules/@types"]

typesRoots 条目指定包含在内的类型定义文件所在的目录列表。此功能要求使用 TypeScript 版本 2.0 或更高版本。


1
安装 @type/node 时,使用 npm install --save @types/node 并不足够。我还需要在我的 tsconfig.json 中添加 "types": ["node"]。谢谢。 - Jeremy Walters
我按照所有步骤操作了,但仍然出现错误。 - zakaria amine
16
我找到了解决方案(我使用的是Angular),需要更新src/tsconfig.app.json而非tsconfig.json,这里提供一个在Github上的问题参考链接:https://github.com/aws/aws-sdk-js/issues/1271#issuecomment-320352814 - zakaria amine

4

由于我想在浏览器环境下使用typescript的Buffer,所以我唯一的解决方案是安装buffer包。

npm install buffer

然后,在您想要使用它的文件中,

import { Buffer } from 'buffer/';

2
这正是我在 Angular 项目中所需要的! - Johnathan
如何在Node.js项目中使用require进行导入。因为import语句只能在模块内部使用。 - Dattatreya Kugve
救命稻草!不确定为什么那个尾随斜杠很重要,但它确实是。没有斜杠在Node中运行正常,但在Bun中失败了。 - undefined

4

要在Karma/Jasmine中解决此问题

  1. 运行

npm install --save @types/node

  1. 在你的tsconfig.spec.json文件中,将以下两行添加到CompilerOptions中:
"compilerOptions": {
    //...
        "types": [ "jasmine" , "node" ],
        "typeRoots": ["node_modules/@types"]
  }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接