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__;