使用 Typescript 时,如何用额外的功能来增强第三方模块?

How to augment 3rd party modules with extra functions when using Typescript?

提问人:Adam Arold 提问时间:8/27/2023 最后编辑:Adam Arold 更新时间:8/27/2023 访问量:45

问:

我已将一个模块导入到我正在处理的实用程序库中,目的是对其进行扩充和重新导出:

import * as ITE from "fp-ts/lib/TaskEither";

const foo = () => "foo";

export const TE = {
    ...ITE,
    foo
};

这非常有效,因为我可以导入其他模块中的内容和从其他模块中导入的内容。问题是导入的模块()还声明了一个接口(),该接口()不知何故没有进入导出,因此当我在其他地方导入时,我看不到.ITEfooITETaskEitherTETE.TaskEither

这有点出乎意料,因为在进行此增强之前,我是这样导出整个模块的:

export * as TE from "fp-ts/lib/TaskEither";

使 VS Code 能够为我自动导入。我现在做错了什么?有没有办法不仅可以从 中导出 s,还可以从 中导出缺失的 s?TEexportconstITEinterface

如果我只是重新添加

export * as TE from "fp-ts/lib/TaskEither";

它失败了,因为它与我的本地声明 .TE

打字稿 FP-TS

评论

0赞 Nikolay 8/27/2023
您的再导出模块中的简单不起作用吗?即没有 TE,因为无论如何您都在主模块中命名它。单独导出项目,即(以 export 作为 foo const 的前缀)export * from "fp-ts/lib/TaskEither";
0赞 Adam Arold 8/27/2023
重点是因为它有助于 VS Code 自动导入(例如:当我输入时,它会自动为我提供导入选项,所以我需要它是一个实际的对象。唯一的问题是,当我重新导出导入时,不会导出。TETETE.interface
0赞 Nikolay 8/27/2023
明白了。也许您可以提供一个完整的示例(例如,所有 3 个文件,完整源代码)以便能够轻松重现。
0赞 Adam Arold 8/27/2023
此示例可用于完全重现代码。我真的没有更多的代码了。
1赞 Nikolay 8/27/2023
你能在这里分享一下解决方案吗?

答:

0赞 Adam Arold 8/27/2023 #1

Typescript 允许导出具有相同名称的 a(合并声明),因此解决方案是将具有相同名称的 a 添加到有问题的命名空间中:namespacetype

import * as ITE from "fp-ts/lib/TaskEither";

const foo = () => "foo";

export const TE = {
    ...ITE,
    foo
};

export namespace TE {
    export type TaskEither<E, A> = ITE.TaskEither<E, A>;
}