类型“typeof globalThis”没有索引签名

Mhd*_*Mhd 62 node.js typescript microservices

每当我尝试在 TypeScript 环境中向全局 Nodejs 全局 namspace 添加函数时,都会收到此错误。

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

声明全局命名空间

declare global {
  namespace NodeJS {
    interface Global {
      signin(): string[]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以如果我尝试这个

global.signin = () => {}
Run Code Online (Sandbox Code Playgroud)

它返回一个

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

IRO*_*00N 77

我遇到了类似的问题,我发现节点的全局类型最近发生了变化;您现在可以通过执行以下操作来覆盖它们:

// global.d.ts
declare global {
    function someFunction(): string;
    var someVariable: string;
}
Run Code Online (Sandbox Code Playgroud)

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

// index.ts
global.someFunction = () => "some value";
global.someVariable = "some value";
Run Code Online (Sandbox Code Playgroud)

  • 我需要将 `export {}` 添加到 `global.d.ts` 来解决“全局范围的增强只能直接嵌套在外部模块或环境模块声明中。”_。@AnthonyLuzquiños - 我想知道编译器是否知道你的 global.d.ts 文件?我将其包含在 tsconfig.json `{..., "include": ["src/**/*", "global.d.ts"]}`, hth (7认同)
  • 嗨@Shamoon,我终于解决了这个问题,它与`ts-node`有关,这是一个相关的[问题](/sf/ask/3612740841/ files-while-tsc-successively-compiles-the-project) 为此,我还写了一篇有关它的 Medium 文章,[此处](https://medium.com/@anthonylzq/how-to-create-global- Variables-in-typescript-with-node-js-9ca24f648991) 就是它。 (7认同)
  • 不适合我,编译器仍然抱怨以下消息:“元素隐式具有“任何”类型,因为类型“typeof globalThis”没有索引签名”。 (4认同)
  • 我尝试过,但 TS 说“在环境上下文中不允许使用语句”。 (3认同)
  • @JossBird 我编辑了答案,以消除其他偶然发现此问题的人的困惑。 (2认同)

Wil*_*ana 45

以下是 Node v16 的示例

// globals.d.ts
declare module globalThis {
    var signin: () => string[];
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是互联网上唯一最新的答案。不知道你是怎么知道这个答案的。我唯一需要注意的是,我的编辑器已将其自动更正为“声明命名空间 globalThis” (4认同)

Coo*_*Lab 21

我在使用 svelte.kit 应用程序时遇到了同样的问题。我的数据库模块使用全局变量来存储 dbClient 作为承诺。当 global.d.ts 文件包含此内容时,VSCode 停止抱怨。

import type { MongoClient } from 'mongodb'

declare global {
  namespace globalThis {
    var _mongoClientPromise: Promise<MongoClient>
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 12

您应该在 global.d.ts 中声明一个全局声明为接口,如下所示:

export interface global {}
declare global {
  var signin: ()=>string[]
}
Run Code Online (Sandbox Code Playgroud)

vscode给出了正确的代码提示


jac*_*srt 8

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

//globals.d.ts
import type { EventEmitter } from "events";
declare global {
    var myGlobal: EventEmitter;
}
Run Code Online (Sandbox Code Playgroud)
/// <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
Run Code Online (Sandbox Code Playgroud)

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

//namedoesntmatter.d.ts
declare var a: string;
Run Code Online (Sandbox Code Playgroud)
//index.ts
global.a = "Hello"
global.a //Hello type: string
window.a //Hello type: string
Run Code Online (Sandbox Code Playgroud)


Mhd*_*Mhd 1

就我自己而言,直到后来我才完全意识到我声明的全局命名空间是区分大小写的。

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

declare global {
  namespace NODEJS {
    interface Global {
      signin(): string[]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

本来应该是这个

declare global {
  namespace NodeJS {
    interface Global {
      signin(): string[]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意NODEJS and NodeJS。在我进行这些更改之后,Typescript 很酷,并且它按照我预期的方式工作。