type 'typeof globalThis' 没有索引签名

Posted

技术标签:

【中文标题】type \'typeof globalThis\' 没有索引签名【英文标题】:type 'typeof globalThis' has no index signaturetype 'typeof globalThis' 没有索引签名 【发布时间】:2021-09-29 13:10:06 【问题描述】:

每当我尝试在 TypeScript 环境中将函数添加到全局 nodejs 全局命名空间时,都会出现此错误。

元素隐式具有“任何”类型,因为类型“typeof globalThis” 没有索引签名

声明全局命名空间

declare global 
  namespace NodeJS 
    interface Global 
      signin(): string[]
    
  

如果我试试这个

global.signin = () => 

它返回一个

元素隐式具有“任何”类型,因为类型“typeof globalThis” 没有索引签名

【问题讨论】:

我希望能正确回答这个确切的问题。尝试使用 Webpack v5 升级到 NextJS v11 时开始出现此错误,我发现的唯一解决方案是将 @types/node@15.12.2 作为依赖项安装。仍在寻找更好的解决方案,但如果有帮助,我会在此处找到此信息。 github.com/facebook/jest/issues/11640 declare global 仅在它包含在项目中时才有效,并且有几种方法可以做到这一点。你能告诉我,你把declare global放在哪个文件里?另外,它和global.signin = () => 在同一个文件中吗? 哦不,它不在同一个文件中。将它放在我项目的另一个文件中,该文件用于开玩笑设置。它不必在同一个文件中工作,因为您的目标是一个全局命名空间,该命名空间旨在通过您的代码库在同一个父文件夹中的所有内容中可用。 【参考方案1】:

我遇到了类似的问题,我发现节点的全局类型是changed recently-ish;您现在可以通过以下方式覆盖它们:

// global.d.ts
declare global 
    function someFunction(): string;
    var someVariable: string;

注意:这不适用于letconst,您必须使用var

// index.ts
global.someFunction = () => "some value";
global.someVariable = "some value";

【讨论】:

我试过了,但是 TS 说Statements are not allowed in ambient contexts. 不适合我,编译器仍然抱怨以下消息:'元素隐式具有'任何'类型,因为类型'typeof globalThis'没有索引签名'。 我需要将export 添加到global.d.ts 以解决“全局范围的增强只能直接嵌套在外部模块或环境模块声明中。” ?。 @AnthonyLuzquiños - 我想知道编译器是否知道您的 global.d.ts 文件?我将它包含在 tsconfig.json ..., "include": ["src/**/*", "global.d.ts"], hth 嗨@Shamoon,我终于解决了这个问题,它与ts-node有关,这是与question相关的,我也写了一篇关于它的Medium文章,here是它。 @JossBird 我编辑了答案,以消除其他任何偶然发现此问题的人的困惑。【参考方案2】:

您必须在declare global 中使用var 关键字,并删除namespace NodeJS 。 像这样:

//globals.d.ts
import type  EventEmitter  from "events";
declare global 
    var myGlobal: EventEmitter;

/// <reference path="globals.d.ts" />
//index.ts
// reference needs to be at top of file
import  EventEmitter  from "events";
global.myGlobal = new EventEmitter();
global.myGlobal // EventEmitter type: EventEmitter
window.myGlobal // EventEmitter type: EventEmitter

或者,如果您在 .d.ts 文件中没有任何导入:

//namedoesntmatter.d.ts
declare var a: string;
//index.ts
global.a = "Hello"
global.a //Hello type: string
window.a //Hello type: string

【讨论】:

【参考方案3】:

我也有同样的问题。通过下面的代码修复它。

declare global 
        function signin(): Promise<string[]>

【讨论】:

您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。【参考方案4】:

在我自己的情况下,直到后来我才意识到我声明的全局命名空间是区分大小写的。

而不是这个。在我的问题被编辑之前它是namespace NODEJS

declare global 
  namespace NODEJS 
    interface Global 
      signin(): string[]
    
  

应该是这样的

declare global 
  namespace NodeJS 
    interface Global 
      signin(): string[]
    
  

关注NODEJS and NodeJS。在我进行这些更改后,typescript 很酷,它可以按我预期的方式工作。

【讨论】:

这不适用于最新版本的@types/node 对不起,我猜我劫持了你的问题:p【参考方案5】:

你应该像这样在 global.d.ts 中声明一个全局接口:

export interface global 
declare global 
  var signin: ()=>string[]

The vscode gives correct code hints

【讨论】:

【参考方案6】:

以下是 Node v16 的示例

// globals.d.ts
declare module globalThis 
    var signin: () => string[];

【讨论】:

【参考方案7】:

只需通过var 关键字声明变量。像这样:

// eslint-disable-next-line no-var
var hello = () =>  console.log("hello world"); ;
// eslint-disable-next-line no-var
var hi: () => number;

globalThis.hello();
globalThis.hi = () => 143;

您也可以在.d.ts 文件中声明变量。

【讨论】:

以上是关于type 'typeof globalThis' 没有索引签名的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:“Window & typeof globalThis”上不存在属性“X”:使用“declare global”的建议解决方案给了我错误

ES11(2020)全局属性 globalThis

ES11(2020)全局属性 globalThis

ES11中的globalThis和可选链

[TypeScript] type、typeof、keyof

封装type,判断对象typeof类型