** 解决了 **
我通过反复试验自己解决了这个问题。在我的用例中起作用的方法(在单独和独立的客户端/服务器 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
.
祝你好运!