2017-09-15 119 views
0

我正在处理一些软件包。他们导出类。一般概念是有一个定义数据存储区行为的核心包,然后是一个postgres包,它为postgres实现一个数据存储区,另一个使用redis存储区实现相同的事物,等等。避免赋值错误与依赖关系的最佳做法?

我的问题是在我的依赖关系树,因为基本的数据存储对rxjs的依赖,以及一些插件模块参考rxjs的。所以:

+ node modules 
+ -- core 
    + rxjs 5.4.0 
+ -- postgres 
    + rxjs 5.4.1 

除非核心和Postgres模块声明对完全相同相同版本rxjs的依赖,这两种不同的rxjs包不会得到重复数据删除。

它们实际上是相同的版本,但它们不是。我明白了。我可以在那里处理角落案件。问题是,我再也不能说

const pgstore: Store = new PostgresStore(); 

,因为我根本无法分配PostgresStore(在我的Postgres包装声明)到通用存储变量(在我的核心包申报),因为有两个不同的版本rxjs,因此Subject<string>我在商店中存储为私有属性最终是两种不同类型的主题,并且这些不可交叉指派。 (例如,编译失败,因为“主题不能键入主题,有两个不同类型的名称存在,但它们是无关的。”)

我必须想象,这并不罕见。什么是最佳实践(构建依赖关系,依赖关系等)以避免这种挂断?它基本上导致了一个非常脆弱的安装,并且有一段时间,我不得不花费一个小时摆弄npm和我的package.json文件以正确地重复删除东西(这也会干扰我使用npm link为本地开发依赖项的能力包,因为这使得重复更加困难)。

+0

嗯,似乎至少有一部分答案是:不要使用私有/受保护的成员。他们最终将打字稿从结构改为主格打字(有效),这可以被看作是“正确但可怕”的行为。 – pfooti

回答

0

一个特定的解决方案,概述here,是通过特别告诉打字稿来解决有问题的声明需要什么版本的东西。我已经更新了我tsconfig.json包括:

compilerOptions: { 
    "baseUrl": ".", 
    "paths": { 
    "@angular/*": ["node_modules/@angular/*"], 
    "rxjs": ["node_modules/rxjs"], 
    "plump": ["node_modules/plump"], 
    "rxjs/*": ["node_modules/rxjs/*"] 
    } 
} 

这似乎是解决自己的问题,现在 - 我仍然能够使用npm link在我丰满的模块工作,没有打字稿让我非常难过。

让问题暂时保留,因为这里可能有更好的答案。

相关问题