当“不要做”不是一个选项时,如何将Typescript命名空间与外部模块混合在一起

情况

我有一个使用命名空间编写的Typescript应用程序。 我想将这些逻辑(Google OAuth)从客户端移到节点服务中。 我在这里创build了一个几乎完整的项目。

这个新项目有一个节点组件,它将使用一个密钥和一个客户端组件来向谷歌发送授权请求,其他应用程序将与服务器通信。 我也有一个testHarness应用程序使用这个客户端来testing它,并确保我可以在基于命名空间的应用程序中使用它。

我有一些客户端和服务器共享的接口。

我希望我的客户端代码可以在使用externam模块和命名空间的项目中使用 – 即我现有的项目。

这一定是可能的

我在很多地方都读过

不要在外部模块中使用“名称空间”。

不要这样做。

认真。 停止。

比如在这个答案上,但我仍然坚信这一定是可能的。 我认为这是因为在我的项目中,我依赖于RxJs。 我的node_modules文件夹中的这个项目被客户端和服务器使用。

我曾经尝试过

在我的项目中,我有一个contracts.d.ts文件,我想在客户端和服务器之间共享。

堆栈溢出

我看着这个问题:

Typescript es6导入模块“文件不是模块错误”

并使我的合同看起来像这样:

 // test.js - exporting es6 export module App { export class SomeClass { getName(): string { return 'name'; } } export class OtherClass { getName(): string { return 'name'; } } } 

然后尝试列出的各种导入方法:

 import * as app1 from "./test"; import app2 = require("./test"); import {App} from "./test"; 

我得到了这些工作,以便我的服务器和客户端编译正确,但只要我试图编译我的testHarness应用程序 – 使用命名空间 – 它失败了:

 src/testHarness/testHarness.ts(4,38): error TS2304: Cannot find name 'PricklyThistle'. src/testHarness/testHarness.ts(4,38): error TS2503: Cannot find namespace 'PricklyThistle'. 

复制来自node_modules的声明文件

正如我所说,我相信,这是可能的,因为我导入到node_modules的依赖关系被我的客户端和服务器项目使用,我的客户端仍然可以与内部命名空间一起使用。

沿着这条路线,我在Rx ts文件夹中编辑了一个d.ts文件,并添加了一个新的界面。 我证实,客户端和服务器都可以使用这个接口,并且我的testHarness应用程序(带有命名空间)将被编译。 一切都很好!

然后我将这个编辑的文件复制到我的公用文件夹。 我不得不重新命名模块,以避免冲突,但后来我得到:

 src/node/youTubeAuthenticationServer.ts(3,23): error TS2306: File '/src/common/rx.test.d.ts' is not a module. 

我编辑的声明文件如下所示:

 declare module RxTest { export interface TestInterface{ propertyOne: string; propertyTwo: number; } } declare module "rx.test" { export = RxTest; } 

解决方法

现在我刚刚复制了两个应用程序使用的接口。 这工作,只有2个小接口,所以这不是一个大问题。 这是非常anooying虽然。 关于节点的好处之一就是使用与浏览器相同的语言。 如果你不能分享不好的代码。 我也有其他更大的代码库,我想要做类似的事情,在这种情况下,复制代码将不是一个可行的解决scheme。

我工作的任何新项目都将使用外部模块,但是在处理遗留代码时并不总是可行的。

我真的希望有人能帮忙。

谢谢

如果发现你的问题有点令人困惑,那么你有太多的描述和太less的例子(代码/configuration)。

尝试做到这一点:

 declare module "rx.test" { export interface TestInterface{ propertyOne: string; propertyTwo: number; } } 

如果这不起作用,请编辑你的问题,并添加你有的目录结构, tsconfig.json文件,解释你如何构build(tsc,gulp等)等等。