gpt4 book ai didi

node.js - 在 Typescript 中增加全局范围不起作用

转载 作者:行者123 更新时间:2023-12-05 04:47:26 29 4
gpt4 key购买 nike

为了了解一些上下文,我在一个微服务应用程序中工作,我有两个类似的服务,它们的包几乎相同。为了进行一些测试,我向全局范围添加了一个函数并对其进行了扩充以避免 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com