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

Posted

技术标签:

【中文标题】全局范围的扩充只能直接嵌套在外部模块或环境模块声明中 (2669)【英文标题】:Augmentations for the global scope can only be directly nested in external modules or ambient module declarations(2669) 【发布时间】:2019-11-29 15:03:11 【问题描述】:

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

我尝试关注这个 => Extending TypeScript Global object in node.js 和 *** 上的其他解决方案,

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

declare global 
    namespace NodeJS 
      interface Global 
          config: MyConfigType
      
    
  

全局范围的增强只能直接嵌套在 外部模块或环境模块声明.ts(2669)

但这样做效果很好 =>

declare module NodeJS  
    interface Global 
        config: MyConfigType
    

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

【问题讨论】:

了解“外部模块”是包含importexport 语句的文件,“环境模块声明”读取declare module "m" (注意引号),并重新读取错误消息。 你可能需要export 在环境声明中。尚未转换为您已经在全局范围内(在声明模块 大括号之外)运行的模块的文件,因此您可以省略声明全局 【参考方案1】:

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

export ;

declare global 
  interface Window 
    ENV: any;
  

【讨论】:

嗯。刚刚尝试过,但每次我关闭 .d.ts 文件时,窗口上的变量都会用红色下划线表示错误。当我打开窗口时,错误消失了。【参考方案2】:

您可以像这样表明该文件是一个模块:

export ;

declare global 
    namespace NodeJS 
        interface Global 
            config: MyConfigType
        
    

【讨论】:

哇,好用!这个“export ;”是什么诡计。您能否提供一些我可以阅读的信息,说明为什么会这样? 我认为诀窍在于“外部模块”是包含导入或导出语句的文件,因此这使其成为“外部模块”。不过,这似乎有点奇怪...... @user1949561 这里很好地解释了为什么***.com/a/42257742/1048847 我认为在另一个文件中声明MyConfigType 然后使用import 也应该可以解决问题。 (如果此选项适用于您的情况)

以上是关于全局范围的扩充只能直接嵌套在外部模块或环境模块声明中 (2669)的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路day4-函数高级特性装饰器

在模块加载/卸载时在外部 C++ 模块中构造/销毁对象

在外部覆盖 python 模块函数

如何在外部模块中使用 Laravel 类?

如何在全局范围内声明管道以在不同模块中使用?

extern关键字