备注:--这是我想发布给别人使用的第一个模块,因为我觉得它非常有用。它是一个用于TypeScript的类型化数据序列化引擎.我有点不知道该怎么做,我需要一个明确的答案。所以谢谢你今天跳进来,让我们开始吧.
我创建了一个npm模块,它使用ES6集合类型Set和Map。这些集合类型是:
这些类型的内部使用并不麻烦,因为据我所知,我可以通过package.json简单地依赖它们,并将它们导入到我的源代码中;然后,它们就会一直存在。
另一方面,,如果我这样做,我的理解是这些导入将覆盖本地Map/Set对象(如果可用的话),并且与我所依赖的类型检测相冲突(或者这些导入是否在可用时生成本机对象?)。
关于上述类型的检测.最好通过一个示例来演示--如果用户要在我的模块中使用Map对象,则应该这样做:
// Consumer code.
class MapContainer {
@JsonMember
mapValues: Map<number, string>;
}下面是在我的模块中检测和处理Map的方式:
// Internal module code.
// Just for the sake of clarity: 'sourceValue === new MapContainer().mapValues'
if (sourceValue.constructor === Map) {
// Handle 'sourceValue' as a map object...
}现在很明显,这将如何引起冲突。相反,这也是一个问题:如果用户将import映射/Set作为模块,而不是使用本机可用的实现,那么我模块的内部代码就不会认识到这一点。
在本例中如何定义我的依赖项?
require('es6-map/implement')?(除了在文档/限制中提到这一点外,我如何确保模块的用户也这样做?)Map和__Set )导入Set和__Map,并使用基于字符串的“类名”检测而不是比较构造函数引用?(这看起来很脏)发布于 2017-01-02 14:40:02
首先,根据定义,无条件应用本身的多边形填充实际上不是一种填充,而是一种黑客(例如zone.js)。行为良好的多填充将使用特征检测,并且只在尚未出现的情况下添加全局填充。
你基本上有三种选择:
Set和Map函数。然后,您的用户可以从各种填充中进行选择。这样做的好处是,如果用户想要使用不同的填充,他们可以这样做,而不增加代码的大小,这对于目标浏览器的项目非常重要。此选项还允许您自己的代码在可用的情况下利用本机实现,这是选项1无法实现的。Map在他们的代码中可用的原因,并且可能会间接地依赖于它。相对于其他依赖项,库的加载顺序可能会导致非常奇怪和难以检测bug。这种方法看起来就像
导入‘ES6-映射/实现’;//变异全局那么,这与您的特定用例有什么关系呢?其中大部分都适用于任何依赖于可能需要填充的特性的库,但正如您所建议的,具体相关的部分与混叠有关。没有必要求助于字符串比较。
相反,如果要导入Map而不是填充它(选项1 )(选项1),您不能将您在实现中导入的Map与从依赖方代码中捕获的值进行比较,因为它将是一个不同的引用,其结果通常是false,而且肯定永远不会可靠。此外,如果您希望它在内置的Map支持、多填充或本地环境中工作,那么sourceValue.constructor === Map中的Map标识符需要引用该环境中的全局Map,不管它是什么。
我推荐选项1,因为它提供了最大的兼容性,并允许您正确地指定依赖项。这意味着在您使用Map的任何地方导入它,如
import Map from 'es6-map';这将创造一个本地的。如果您需要在与全局Map交互的模块中使用它,那么您将需要使用别名导入它,正如您已经考虑过的那样。
值得注意的是,
sourceValue.constructor === Map如果全局上没有Map,则会添加一些环境,因此您需要使用以下内容进行检查
typeof Map !== 'undefined' && sourceValue.constructor === Map为了安全起见。
不相关,请将打开的{放在同一行,无论什么需要它。这在JavaScript中很重要。
https://stackoverflow.com/questions/41425779
复制相似问题