0

我对 Typescript 比较陌生,我正在尝试从创建的私有 ts 存储库导入和重用接口,以在节点/ts 服务器和 Angular 客户端之间共享类型/类/接口。这是通过要求私有仓库作为 Angular package.json 中的依赖项来实现的。

命名空间在 ts repo 中声明,如下所示:

export namespace foo {
  export interface Bar {
   ...
  };
  export type Foo {
  ...
  };

将 foo 导入客户端后import { foo } from 'repo/foo,我可以访问函数和类(例如 foo.fn()),但无法查看或访问 Bar 接口或 Foo 类型。

这是因为接口和类型只是 ts 并且 Angular 客户端只能导入可编译为 javascript 的东西吗?

包所有者想要在命名空间中声明所有内容,但我不想重新声明/重复类型和接口,因为这会否定共享 ts 包的大部分目的。

如果您能建议替代方法,将不胜感激!

4

2 回答 2

0

** 解决了 **

我通过反复试验自己解决了这个问题。在我的用例中起作用的方法(在单独和独立的客户端/服务器 TS 存储库(NON-monorepo)之间共享一个单独的 TS 存储库)是通过像我在原始问题中一样声明名称空间,但问题是:

1) vscode intellisense 不能可靠地更新每个npm i共享包。有时确实如此。有时它不会。如果它无法识别对共享存储库的命名空间/类型/枚举的更改,请始终关闭并重新打开整个 vscode 窗口(您在其中运行 npm i 导入)。您不必关闭所有窗口;只是没有更新的那个。随着时间的推移,您将准确了解可以导入和不能导入的内容,以及智能感知何时未正确更新。有时导航到已编译 /node_modules/ 中的命名空间会导致更改被识别,但并非总是如此。

2)我试图在我自己的机器上本地链接到 package.json 中的共享仓库。当您安装 ts 遥控器时,它会编译;您只能将 ts 编译的内容导入和使用到.d.ts后缀文件。我发现在共享存储库中进行更改、提交并将它们推送到远程,然后npm i git+ssh://git@github.com/<user>/<repo>#<branch>在客户端/服务器存储库中运行更容易。这确保了我始终拥有与其他开发人员从远程安装共享包相同的体验。

3)您必须export在该命名空间中同时使用命名空间和每个封装的接口/类型/枚举,否则它将无法编译,.d.ts并且您无法将这些更改从远程导入到单独的位置。

4) 始终使用客户端/服务器提交提交 package-lock.json(对于对共享包所做的更改),因为它保留了为这些更改导入的确切共享包提交哈希。

我还为所有枚举和类型创建了一个文件和命名空间(enums.ts,每个枚举在命名空间中按字母顺序排列)。这比允许在任何地方声明它们更干净、更容易共享,特别是对于导入客户端/服务器:

import { enums, types } from 'shared_package';

const variable: types.ProductType = enums.PRODUCT.TYPE

尝试防止命名空间与常见变量名发生冲突,可能通过区分每个命名空间,例如ns_enums.

祝你好运!

于 2019-04-21T05:10:45.847 回答
0

在仅在编译步骤中使用的 typescript 接口中,用于检查引用变量的正确使用。Typescript 编译器不创建接口函数或在 javascript 中键入。
您应该使用接口和类型来定义变量和函数的类型:

import { foo } from 'repo/foo';

var item1: foo.Bar;
var func = (): foo.Foo => {
...
}

Typescript 接口
Typescript 命名空间

如果您使用编译到 javascript lib 'repo',则不能使用在 typescript 中声明的类型和接口,因为编译器不会为 js 中的接口创建任何东西。
但是,如果后端和客户端在一个项目中,则可以通过将其作为模块导入来使用未编译的库。

于 2019-03-15T05:44:34.143 回答