Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js全局变量和类型脚本_Javascript_Node.js_Oop_Typescript_Module - Fatal编程技术网

Javascript Node.js全局变量和类型脚本

Javascript Node.js全局变量和类型脚本,javascript,node.js,oop,typescript,module,Javascript,Node.js,Oop,Typescript,Module,我需要一些强类型的全局变量 正如这里提到的:,为了向global变量添加字段,我需要添加一个.d.ts文件,该文件扩展node.d.ts中指定的global接口 此外,正如巴萨拉特所提到的: 您的文件需要清除任何根级别的导入或导出。那个 将文件转换为模块,并将其与全局 类型声明命名空间 现在,我需要在Global接口上有一些字段,这些字段的类型是我创建的自定义接口: declare namespace NodeJS{ interface Global { foo: Foo

我需要一些强类型的全局变量

正如这里提到的:,为了向
global
变量添加字段,我需要添加一个.d.ts文件,该文件扩展node.d.ts中指定的
global
接口

此外,正如巴萨拉特所提到的:

您的文件需要清除任何根级别的导入或导出。那个 将文件转换为模块,并将其与全局 类型声明命名空间

现在,我需要在
Global
接口上有一些字段,这些字段的类型是我创建的自定义接口:

declare namespace NodeJS{
    interface Global {
        foo: Foo
        bar: Bar
    }
}
我非常不愿意使用
any
类型

我可以将所有接口声明移动/复制到此声明文件,但这对我来说是一个糟糕的解决方案,因为Foo和Bar反过来聚合了其他接口的许多字段,包括第三方接口,如矩等

我需要一个解决这一矛盾的办法

我发现这是可行的

在NodeJS.Global接口上有一个声明任何类型属性的文件。此文件必须没有导入或引用

node.d.ts

declare namespace NodeJS{
    interface Global {
        foo: any
    }
}
import IFoo from '../foo'

declare global {

  const foo:Ifoo

}
然后在第二个文件中声明一个具有正确类型的全局变量

global.d.ts

declare namespace NodeJS{
    interface Global {
        foo: any
    }
}
import IFoo from '../foo'

declare global {

  const foo:Ifoo

}

这里有一个方法。我不知道这是否是做事情的“正确”方式,但它适用于我的TypeScript 3.7.4

  • 假设源文件位于文件夹
    src
    中,则创建一个新文件夹
    src/types
    ,并在此文件夹中创建一个文件
    global.d.ts
  • 使用以下策略之一编写声明:
    • 如果需要将外部类型导入到声明文件中,请使用以下语法:
    • 如果您的声明文件不包含任何导入,则上述操作将不起作用,您需要改用以下语法:
  • 通过将以下内容添加到
    tsconfig.json
    文件中,确保TypeScript编译器拾取了您的
    global.d.ts
    文件(以及您可能添加到
    src/types
    的任何其他文件):
  • 在代码中正常使用全局变量

  • 您找到解决方法了吗?请注意,当使用此方法时,所有
    global.foo
    用法仍将是
    any
    类型,这令人恼火。但是,您至少能够全局使用
    foo
    作为
    Ifoo
    类型。不过,这足以让我们向前迈进。我希望TypeScript团队能够就这方面的最佳实践发表意见;自从TypeScript存在以来,这一直是一个问题。我收到以下错误错误:⨯ 无法编译TypeScript:src/index.ts:3:8-错误TS2339:编译时,类型“全局”上不存在属性“env”。我发现唯一有效的解决方案。在我的例子中,我只有基本属性,所以在这种情况下,您只需要node.d.ts global{foo:string,bar:string}。。。
    {
      "paths": {
        "*": ["node_modules/*", "src/types/*"]
      }
    }
    
    // Below, `app` will have the correct typings
    const app = global.__EXPRESS_APP__;