You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TypeScript中如何合并无导出接口的命名空间?Bull库场景实践

扩展Bull库的命名空间并在应用中使用

首先得明确:原Bull库用的是export =导出的混合类型(既是函数又是命名空间),直接用import再声明命名空间的方式没法和原类型合并,得用**TypeScript模块扩充(Module Augmentation)**来搞定。

步骤1:在你的库中扩展Bull的类型

修改myLib/index.d.ts,不要用import { Queue } from 'bull',而是直接通过declare module 'bull'来扩充原模块的命名空间:

// myLib/index.d.ts
declare module 'bull' {
  namespace Bull {
    // 在这里添加你自定义的接口或类型
    export interface CustomJobMetadata {
      userId: string;
      requestId: string;
    }

    // 也可以扩展Bull已有的接口,比如给Queue加自定义方法
    export interface Queue {
      // 新增一个自定义方法的类型声明
      cleanOldJobs(days: number): Promise<number>;
    }
  }
}

步骤2:确保你的库类型被识别

在你的库的package.json里,设置types字段指向这个类型文件,让TypeScript能找到它:

{
  "name": "myLib",
  "types": "index.d.ts",
  // 其他配置...
}

步骤3:在应用中使用合并后的类型

安装bull和你的库之后,直接用import = require(因为原Bull用的是export =)来导入,就能直接使用扩展后的类型了:

// 应用中的代码
import Bull = require('bull');

const myQueue = Bull('user-jobs');

// 调用扩展的方法(类型会被自动识别)
myQueue.cleanOldJobs(7).then(deletedCount => {
  console.log(`Deleted ${deletedCount} old jobs`);
});

// 使用自定义的接口类型
const jobMeta: Bull.CustomJobMetadata = {
  userId: '123',
  requestId: 'abc-xyz'
};

关键注意点

  • 不要在扩充模块的文件里用import/export(除了模块扩充内部的),否则会把文件变成普通模块,导致扩充失效。
  • 模块扩充必须在顶级作用域,不能嵌套在其他命名空间或模块里。
  • 这种方式不仅能添加新接口,还能扩展Bull原有的接口(比如Queue、Job),让你的自定义方法或属性有完整的类型支持。

内容的提问来源于stack exchange,提问作者Brick Yang

火山引擎 最新活动