gpt4 book ai didi

node.js - 当 "Don' t do it 不是一个选项时,我如何将 Typescript 命名空间与外部模块混合使用?

转载 作者:搜寻专家 更新时间:2023-10-30 21:14:09 24 4
gpt4 key购买 nike

情况

我有一个使用命名空间编写的 Typescript 应用程序。我想将其中的一些逻辑 (Google OAuth) 移出客户端并移至 Node 服务中。我已经为此创建了一个几乎完整的项目 here .

这个新项目有一个 Node 组件,可以使用 key 向 google 发出授权请求,还有一个客户端组件,可以由将与服务器通信的其他应用程序重复使用。我还有一个 testHarness 应用程序,它使用此客户端对其进行测试,并确保我可以在基于命名空间的应用程序中使用它。

我有一些客户端和服务器都使用的共享接口(interface)。

我希望我的客户端代码可用于使用外部模块和命名空间的项目 - 即我现有的项目。

一定是可以的

我看过很多地方

Do not use "namespaces" in external modules.

Don't do this.

Seriously. Stop.

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

我尝试过的

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

计算器溢出

我看了这个问题:

Typescript es6 import module "File is not a module error"

让我的契约(Contract)看起来像这样:

// 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 文件并添加了一个新界面。我验证了客户端和服务器都可以使用这个接口(interface),并且我的 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; }

解决方法

现在我只是复制了两个应用程序使用的接口(interface)。这行得通,而且只有 2 个小接口(interface),所以没什么大不了的。虽然这很烦人。 node 的一大优点是它使用与浏览器相同的语言。如果您不能共享不好的代码。我还有其他更大的代码库,我想用它们来做类似的事情,在这些情况下,复制代码将不是一个可行的解决方案。

我从事的任何新项目都将专门使用外部模块,但在使用遗留代码时,这并不总是可行的。

我真的希望有人能提供帮助。

谢谢

最佳答案

如果您发现您的问题有点令人困惑,那是因为您的描述太多而示例(代码/配置)太少。

尝试这样做:

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

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

关于node.js - 当 "Don' t do it 不是一个选项时,我如何将 Typescript 命名空间与外部模块混合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40561003/

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