如何合并TypeScript中没有导出接口的命名空间

2024-01-31

我在 TypeScript 中使用队列 lib Bull。它的定义是:

node_modules/@types/bull/index.d.ts

declare const Bull: {
  (queueName: string, opts?: Bull.QueueOptions): Bull.Queue;
  // something like above
};

declare namespace Bull: {
  interface Queue {}
  interface Job {}

  // some other non-exported interfaces
}

export = Bull

我想合并命名空间Bull在我的图书馆中并在另一个应用程序中使用它。

node_modules/myLib/index.d.ts

import { Queue } from 'bull'

declare namespace Bull: {
  export interface Queues {}
}

export interface myInterface {
  foo: Queue | Bull.Queues
}

export = Bull

myApp/foo.ts

import { Job, Queues } from 'myLib' // Error, 'myLib' has no exported member 'Job'

根据文档,命名空间是一个全局变量,同名的命名空间将合并它们的 EXPORTED 接口。那么,如何合并命名空间Bull from @types/bull?谢谢!


嗯,事实是这样的@types\bull并没有真正声明一个名称空间。

嗯,确实如此,但只是将相关类型的列表分组并将它们作为默认导出一起导出,所以,它真正导出的是contents命名空间的名称,而不是名称空间本身。这就是为什么你可以导入Queue,并使用Queueand not Bull.Queue,这是你应该做的,如果Queue真正属于一个名称空间。

另外,我不知道你正在使用什么版本的 TypeScript,但你不应该使用export (...) and export = (...)在同一个文件中。此外,当你添加export到一个文件,它变成一个模块的声明文件,所以,最后,你有一个默认导出命名空间的模块,然后你可以导入Queues from myLib, 但不是Job, as Job没有出现在文件中的任何位置,因此不会导出。

为了能够合并不同文件中的命名空间,您不能使用导入或导出,而只能使用声明,因为两个模块永远不能向同一个命名空间提供名称。通过使用export,你将你的文件变成模块,一旦你这样做,它们中的命名空间就不再属于全局范围,所以即使它们具有相同的名称,它们实际上属于它们自己的模块的范围,而不是合并。

为了做你想做的事,你必须:

bull:

declare const Bull: {
    (queueName: string, opts?: any): Bull.Queue;
    // something like above
  };

declare namespace Bull {
    interface Queue {}
    interface Job {}

    // some other non-exported interfaces
}

myLib:

declare namespace Bull {
  export interface Queues {}
}

declare interface myInterface {
  foo: Bull.Queue | Bull.Queues
}

现在您真正拥有了一个包含两个声明内容的命名空间:

test.ts:

const a: Bull.Queues = {};
const g: Bull.Queue = {};
const b: Bull.Job = {};

这样它就可以工作,但不幸的是,这不是你所拥有的。你应该定义myLib as:

import * as Bull from './bull';

export interface Queues {};


export interface myInterface {
  foo: Bull.Queue | Queues;
}

然后你可以使用:

import * as Bull from './bull';
import { Queues, myInterface } from './myLib';

const a: Queues = {};
const g: Bull.Queue = {};
const b: Bull.Job = {};

const instance: myInterface = null;

或者,如果您愿意,

import * as Bull from './bull';
import * as ExtendedBull from './myLib';

const a: ExtendedBull.Queues = {};
const g: Bull.Queue = {};
const b: Bull.Job = {};

const instance: ExtendedBull.myInterface;

但是,无论如何,您都需要从两者导入bull and myLib.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何合并TypeScript中没有导出接口的命名空间 的相关文章

随机推荐

  • Powershell 参数路径的值为 NULL

    我开发了一个 PS1 文件 它将负责基于服务器列表应用 SQL Server 补丁 因此 它将读取一个文本文件 其中包含我需要修补并应用修补程序的所有服务器 我决定使用 PARAM 作为 源文件夹 我将在其中获取服务器列表并记录输出 目标文
  • 替换 CSV 第一列中的数据

    我有一个包含许多列的 CSV 第一列中的数据是日期 但格式错误 我可以仅选择第一列并重新格式化日期 但我无法弄清楚如何将新数据保存到现有 CSV 而不覆盖所有其他数据 File File csv Content Get Content Fi
  • 新的Google Play控制台:在哪里上传mapping.txt?

    我不知道在新的 Google Play 管理中心中将mapping txt 上传到哪里 要上传反混淆 打开 Play 管理中心 选择一个应用程序 在左侧菜单中 选择 发布 gt 应用程序包资源管理器 选择 下载 选项卡 然后向下滚动到 资产
  • 将单元格中的值范围转换为逗号分隔列表

    我可以在单元格 B1 中使用一个公式来查看 A1 并创建一个基于逗号的列表吗 所以下面我可以输入 A1 B1是一个公式 这可能吗 我会让 A1 始终遵循与 XXX XXX 范围相同的格式 TABLE A Input B Result 1 1
  • 网站图标-MVC3 ASP.NET

    favicon ico 需要什么 我正在尝试使用 MVC 错误处理 但它抱怨文件丢失 如何摆脱此错误 Thanks 前往RegisterRoutes的方法全局 asax cs文件 并将其添加为第一行之一 routes IgnoreRoute
  • MATLAB脚本代码和函数代码在同一个文件中? [复制]

    这个问题在这里已经有答案了 可能的重复 在 MATLAB 中 我可以在同一个文件中包含脚本和函数定义吗 https stackoverflow com questions 5363397 in matlab can i have a scr
  • 通过网络(FTP、HTTP、RSync 等)传输文件的最快方法是什么[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图找出通过网络在两个系统之间传输大量数据的最佳方法 我目前正在研究 FTP HTTP 或 RSync 我想知道哪一个最快 我在网上寻找
  • 获取 SQLalchemy Instrumentedattribute 的值

    我怎样才能获取a的值InstrumentedAttributeSQLalchemy 中的对象 Pdb ResultLine item reference 1
  • 如何删除所有神秘的“index on”和“WIP on”提交?

    我刚刚被要求修复我的应用程序中的一个错误 我收藏了我当前的工作并查看了我的最新版本标签 我立即注意到这是一个错误 因为 Git 消息告诉我我的提交不会被保存 所以我检查了master反而 但在我这样做之前 我已经打开了我的藏品 重新藏起来的
  • 在一个事务 SQL 中删除和插入

    我只是想问封装到事务时是否总是第一个查询被执行 例如我有50万条记录要删除 50万条记录要插入 是否有可能锁定 实际上我已经测试了这个查询并且它工作正常 但我想确定我的假设是否正确 注意 这将删除并插入相同的记录 并可能更新其他列 BEGI
  • 下拉选择控件 - Windows 8 Metro - XAML

    我想要如下图所示的下拉菜单 我不知道如何得到它们 我想这些是某种组合框 但我不确定 任何人都可以帮助我并提供 xaml 代码吗 谢谢 我想你正在寻找组合框 Windows 8 商店控件列表 MSDN http msdn microsoft
  • ng-click 在 MVC 部分视图中不起作用

    我有一个使用 angular js 和 MVC 的单页面应用程序 该页面调用两个部分视图 Menu Accounts 菜单加载良好 当用户单击菜单项时 我使用角度 ng click 调用另一个部分视图 并将部分视图结果注入主页中 问题是我的
  • LAMP 显示 php 错误

    我已经安装了开发人员的 LAMP 服务器并在 php ini 上进行了更改 显示错误打开 显示启动错误打开 但它没有显示任何错误 甚至没有一点警告 问题出在哪里 出了什么问题 请记住 大多数系统都有两个 php ini 文件 一个用于网络服
  • 在 matplotlib 中绘制黑白二值图

    我使用 python 来模拟一些自动化模型 并在 matplotlib 的帮助下生成如下所示的图 我目前正在使用以下命令进行绘图 ax imshow self g cmap map interpolation nearest where s
  • 使用maven scm插件提交多个文件

    我想使用 maven scm 插件 v1 9 4 在不同的文件夹中 git 提交两个文件 例如 abc p json and xyz p json 我不想提交任何其他文件 例如other p json 根据文档 http maven apa
  • Ninject:将多种类型绑定到同一个单例实例

    interface IService
  • 将 JSON 数组发布到 Android 中的 Web 服务

    我在执行一项相当简单的任务时遇到了一些问题 我只需要一个 JSON 数组 其中包含一个 JSON 对象即可发布到我的 Web 服务 整个 URL 请求的格式需要如下所示 http www myserver com myservice php
  • Instagram 用户对象中每个个人简介的空字符串

    我已经尝试过 通过 Python 中的 API 库以及 Instagram 和 apigee com 提供的 API 控制台 我使用请求 GET tags tag name media recent 我试过ferrari tag 所有结果都
  • 奇怪的 lxml 行为

    我手动创建 xml 然后尝试使用 xsd 方案验证它 验证一开始没有通过 但如果我将 xml 转换为字符串并返回 那么新的 xml 将通过验证 from lxml import etree xsd etree fromstring
  • 如何合并TypeScript中没有导出接口的命名空间

    我在 TypeScript 中使用队列 lib Bull 它的定义是 node modules types bull index d ts declare const Bull queueName string opts Bull Queu