Typescript中的增强全局作用域不起作用



为了获得一些上下文,我正在一个微服务应用程序中工作,在该应用程序中,我有两个具有几乎相同包的类似服务。为了进行一些测试,我在全局范围中添加了一个函数,并对其进行了扩展,以避免类型脚本错误。问题是,在一个服务中没有错误,而在另一个没有

这是代码:

import { MongoMemoryServer } from 'mongodb-memory-server';
import mongoose from 'mongoose';
import jwt from 'jsonwebtoken';
// --- This is not working
declare global {
namespace NodeJS {
interface Global {
signup(id?: string): string[];
}
}
}
// ---
jest.mock('./../nats-wrapper.ts');
let mongo: any;
beforeAll(async () => {
process.env.JWT_KEY = 'only_for_testing';
mongo = new MongoMemoryServer();
const mongoUri = await mongo.getUri();
await mongoose.connect(mongoUri, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
});
beforeEach(async () => {
jest.clearAllMocks();
const collections = await mongoose.connection.db.collections();
for (let collection of collections) {
await collection.deleteMany({});
}
});
afterAll(async () => {
await mongo.stop();
await mongoose.connection.close();
});
// --- This is not working
global.signup = (id?:string) => {
// Build a JWT payload. {id, email}
const payload = {
id: id || new mongoose.Types.ObjectId().toHexString(),
email: 'test@test.com',
};
// Create the JWT!
const token = jwt.sign(payload, process.env.JWT_KEY!);
// Build session Object
const session = { jwt: token };
// Turn sesion into JSON
const sessionJSON = JSON.stringify(session);
// Encode to Base64
const base64 = Buffer.from(sessionJSON).toString('base64');
// return a string with the enconded data;
return [`express:sess=${base64}`];
};
// ---

这就是我得到的错误:TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.

在调试node_modeles(查看幕后发生了什么(时,我注意到{globals.global.d.ts}文件没有使用声明进行更新。

工作服务globals.global.d.ts:

declare var global: NodeJS.Global & typeof globalThis;

不工作服务globals.global.d.ts:

declare var global: typeof globalThis;

*如果这是一个愚蠢的错误,我深表歉意,我对TS*还很陌生

对于@types/node版本16及更高版本,正确的方法是通过:

declare var signup(id?: string): string[];

您可以只使用declare var(通常在.d.ts文件中(来向global声明您的自定义扩充。

另一个例子:

// eslint-disable-next-line no-var 
declare var __MONGOD__: import('mongodb-memory-server').MongoMemoryReplSet;

请注意,如果将var更改为let,则可能需要禁用esint自动修复,因为let无法正常工作。

以下是解决方案:-

node@16开始,NodeJS.Global接口已被删除,取而代之的是globalThis

您可以在模块文件中声明一个新的全局变量为:

declare global {
var NEW_GLOBAL: string;
}

在您的情况下,它将是:-

declare global {
var signup: (id?: string) => string[];
}

注意:变量必须声明为varletconst

您现在可以访问项目中任何模块中的global.signup

我不知道这是否是一种方法,但我通过添加@types/node作为依赖项解决了这个问题。

最新更新