如何访问Textencoder作为一个全局,而不是从util包导入?



我使用Node v18.0.0与TypeScript,似乎TextEncoder类是一个全局的。

不幸的是,这个代码const textEncoder = new TextEncoder();是无效的,因为它不知道这个类。我必须导入util包才能使其工作,否则我会得到错误

找不到名称'TextEncoder'。你是说"textEncoder"吗?

我使用的是"@types/node": "17.0.23""typescript": "4.6.3"包。tsconfig。json文件

{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"esModuleInterop": true,
"lib": [ "esnext" ],
"module": "commonjs",
"outDir": "build",
"resolveJsonModule": true,
"strict": true,
"target": "es2019"
},
"include": [
"./**/*.ts"
],
"exclude": [
"./build"
]
}

有人知道如何解决这个问题吗?我是否必须使用一些额外的软件包或修改我的TS配置?

如果你需要更多的信息,请告诉我!

这看起来像Node.js文档(和运行时)和DefinitelyTyped中的@types/node包之间的不一致(至少)。这个问题与URL非常相似,它已经通过在url.d.ts中添加global声明来修复。也许值得开一期(做一次公关)。

正如你所说,TextEncoder绝对是全局的(文档和快速测试都告诉我们),但@types/node/globals.d.ts没有它。@types/node/utils.d.ts确实有它(如您所示),甚至有注释"TextEncoder类也可以在全局对象上使用。">但是…它不是(不像URL,[现在]是)。

如果你写的代码是特定于node .js的,我会直接导入,而不用担心它。

但是如果你写的代码应该针对Node.js和浏览器,这显然不是一个选择。在URL问题线程中提到的一个解决方案是将"dom"添加到您的lib配置设置中,但这意味着所有DOM内容都添加到您的全局命名空间中。

或者,除非类型更新了,否则您可以自己声明全局变量。在项目的根目录下:

whatever.d.ts:

import { TextEncoder as _TextEncoder } from "node:util";
declare global {
var TextEncoder: typeof _TextEncoder;
}

当您执行new TextEncoder(时,您不会获得有用的弹出信息,但它确实有效,并且您确实获得了有用的方法信息等

最新更新