全局范围的扩展只能直接嵌套在外部模块或环境模块声明中(2669)

Bob*_*bby 7 typescript

我想将我的NodeJS配置存储在全局范围内。

我试图遵循此=> 在node.js和其他Stackoverflow解决方案中扩展TypeScript Global对象

我制作了一个名为global.d.ts的文件,其中包含以下代码

declare global {
    namespace NodeJS {
      interface Global {
          config: MyConfigType
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

全局作用域的扩展只能直接嵌套在外部模块或环境模块声明中。ts(2669)

但是这样做很好=>

declare module NodeJS  {
    interface Global {
        config: MyConfigType
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我需要导入文件MyConfigType以键入配置,但是第二个选项不允许这样做。

ssh*_*shh 197

您可以指出该文件是一个模块,如下所示:

export {};

declare global {
    namespace NodeJS {
        interface Global {
            config: MyConfigType
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,有效!这个“export {};”是什么诡计。您能否提供一些我可以阅读的信息来了解其为何有效? (14认同)
  • 我认为诀窍在于“外部模块”是包含导入或导出语句的文件,因此这使其成为“外部模块”。虽然需要这样做,但这似乎有点奇怪...... (6认同)
  • @user1949561 这里有一个很好的解释为什么 /sf/answers/2958041971/ (5认同)

Cob*_*urn 14

如果您.d.ts作为“脚本”执行(它没有语句),则根本import/export不需要,只需将其删除即可。declare global“脚本”已经在全局上下文中执行。

(旁白:这就是添加export {}起作用的原因,它将它从“脚本”变成“模块”,并且.d.ts默认情况下您的声明不再是全局的)

以修改示例console

前:

declare global {
  interface Console {
    log2: (...args: any[])=>void;
  }
}
Run Code Online (Sandbox Code Playgroud)

后:

// This will be global!
interface Console {
  log2: (...args: any[])=>void;
}
Run Code Online (Sandbox Code Playgroud)

感谢 @okcoker 和/sf/answers/2958041971/对 .d.ts 上下文的解释


Ben*_*ing 13

或者,如果您尝试在浏览器上下文中添加全局类型:

export {};

declare global {
  interface Window {
    ENV: any;
  }
}
Run Code Online (Sandbox Code Playgroud)