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

标签 node.js typescript global

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

相关文章:

javascript - 从 MongoDB 查询数据到 Javascript

node.js - 如何使用 { $text : { $search: search } } within sails-mongodb?

typescript - 如何避免将 DOM 元素强制转换为 Typescript 中的任何元素?

c# - 全局变量未在新线程中初始化

javascript - 如何使用 Puppeteer 计算页面完全加载时间?

node.js - 这个错误: Falsy value for recipient key 'registrationTokens' 是什么意思

gradle - Gradle-任务名称的驼峰式保护套-首字母大写

Java,在swing应用程序中保持全局数据库 session

javascript - 自定义 vue 组件的模糊事件

angular - 如何让api调用一对一而不是并发