为了了解一些上下文,我在一个微服务应用程序中工作,我有两个类似的服务,它们的包几乎相同。为了进行一些测试,我向全局范围添加了一个函数并对其进行了扩充以避免 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_modelues(以查看幕后发生的情况)时注意到,{globals.global.d.ts} 文件未随声明更新。
工作服务globals.global.d.ts:
声明 var global: NodeJS.Global & typeof globalThis;
不工作服务globals.global.d.ts:
声明 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
,您可能需要禁用 eslint 自动修复,因为 let
将无法正常工作。
关于node.js - 在 Typescript 中增加全局范围不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68486737/