gpt4 book ai didi

typescript - 如何合并命名空间在 TypeScript 中没有导出接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-30 20:43:13 25 4
gpt4 key购买 nike

我在 TypeScript 中使用队列库 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'

根据文档,namespace 是一个 GLOBAL 变量,同名的 namespace 将合并它们的 EXPORTED 接口(interface)。那么,如何从 @types/bull 中合并命名空间 Bull?谢谢!

最佳答案

嗯,事实是@types\bull并不是真正声明一个命名空间。

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

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

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

要完成您想要做的事情,您必须拥有:

公牛:

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

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

// some other non-exported interfaces
}

我的图书馆:

declare namespace Bull {
export interface Queues {}
}

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

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

测试.ts:

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

这样它会工作,但不幸的是,这不是你所拥有的。您应该定义 myLib作为:

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 中导入和 myLib .

关于typescript - 如何合并命名空间在 TypeScript 中没有导出接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724861/

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