Node.js全局变量和TypeScript

Alo*_*lon 5 javascript oop module node.js typescript

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

如下所述:在node.js中扩展TypeScript Global对象,为了向global变量添加字段,我需要添加一个扩展Globalnode.d.ts中指定的接口的.d.ts文件.

另外,正如Basarat所说:

您的文件需要清除任何根级别导入或导出.这会将文件转换为模块并将其与全局类型声明命名空间断开连接.

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

declare namespace NodeJS{
    interface Global {
        foo: Foo
        bar: Bar
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常不愿意使用这种any类型.

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

我需要一个解决这个悖论的方法

Tom*_*cer 10

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

  1. 假设您的源文件位于一个文件夹中src,请创建一个新文件夹src/typesglobal.d.ts在该文件夹中创建一个文件。
  2. 使用以下策略之一编写您的声明:
    • 如果需要将外部类型导入到声明文件中,请使用以下语法:
import { Express } from 'express';

declare global {
  namespace NodeJS {
    interface Global {
      __EXPRESS_APP__: Express;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 如果您的声明文件不包含任何导入,则上述方法将不起作用,您需要改用以下语法:
declare namespace NodeJS {
  interface Global {
    __CONNECTION_COUNT__: number;
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 通过将以下内容添加到您的文件中,确保您的global.d.ts文件(以及您可能添加到的任何其他文件src/types)被 TypeScript 编译器选中tsconfig.json
{
  "paths": {
    "*": ["node_modules/*", "src/types/*"]
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在代码中正常使用全局变量。
// Below, `app` will have the correct typings
const app = global.__EXPRESS_APP__;
Run Code Online (Sandbox Code Playgroud)


小智 7

我发现这有效。

有一个文件,用 any 类型声明 NodeJS.Global 接口上的属性。该文件必须没有导入或引用。

节点.d.ts

declare namespace NodeJS{
    interface Global {
        foo: any
    }
}
Run Code Online (Sandbox Code Playgroud)

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

global.d.ts

import IFoo from '../foo'

declare global {

  const foo:Ifoo

}
Run Code Online (Sandbox Code Playgroud)