>情况
我有一个使用命名空间编写的打字稿应用程序。我想将其中一些逻辑(Google OAuth(移出客户端并移入节点服务。我在这里创建了一个几乎完整的项目。
这个新项目有一个节点组件,它将使用密钥向谷歌发出授权请求,还有一个客户端组件,可以被其他将与服务器通信的应用程序重用。我还有一个testHarness应用程序,它使用此客户端对其进行测试,并确保我可以在基于命名空间的应用程序中使用它。
我有一些客户端和服务器都使用的共享接口。
我希望我的客户端代码可以在使用 externam 模块和命名空间的项目中使用 - 即我现有的项目。
一定是可能的
我在很多地方读过书
不要在外部模块中使用"命名空间"。
别这样。
认真地。停。
比如这个答案,但我仍然相信这一定是可能的。我认为这是因为在我的项目中,我依赖于 RxJs。我的node_modules文件夹中的这个项目由客户端和服务器使用。
我试过什么
在我的项目中,我有一个contracts.d.ts
文件,我想在客户端和服务器之间共享该文件。
堆栈溢出
我看了这个问题:
打字稿 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 个小接口,所以没什么大不了的。不过,这很不舒服。node的一大优点是它使用与浏览器相同的语言。如果您不能共享不好的代码。我还有其他更大的代码库,我想用它们做类似的事情,在这些情况下,复制代码将不是一个可行的解决方案。
我从事的任何新项目我都会专门使用外部模块,但在使用遗留代码时,这并不总是可能的。
我真的希望有人能帮忙。
谢谢
如果你发现你的问题有点令人困惑,那么你所拥有的描述太多,例子(代码/配置(太少。
尝试这样做:
declare module "rx.test" {
export interface TestInterface{
propertyOne: string;
propertyTwo: number;
}
}
如果这不起作用,请编辑您的问题并添加您拥有的目录结构、您拥有的tsconfig.json
文件、解释您如何构建(tsc、gulp 等(等。