欢迎!请查看关于页面以获取有关如何使用该功能的更多信息。
ClojureScript 使用 JavaScript 的唯一数值类型 Number 表示如 {:person/weight 200.0} 这样的数值。当这样的记录与 transit 进行序列化时,transit 观察到 Number: 200 并将其打包为整数,然后其他平台例如 JVM 会将其解包为整数,而不是浮点数,除非我根据表示 :person/weight 实际上是 :db.type/float 的模式预处理值,否则系统如 Datomic 会因为类型不匹配而崩溃。
这是 transit 中的设计缺陷吗?transit 是否应该改变,以允许我指定类型以及与模式提供者(spec)集成以选择正确的类型?
我只是试图稍微重申一下您的问题,我认为您是想问,transit-cljs(或者实际上是 transit-js)是否有将 JavaScript 数字 200.0 强制编码为 transit 基础类型“浮点小数”的办法?(这并不是真正的问题,因为 transit 本身具有表示固定和任意精度整数和浮点数的能力。因此,这实际上是一个特定语言编码器的问题。)
我认为答案是否定的(但我不是这个领域js方面的专家)。transit-js/transit-cljs仅编码transit基本类型i(整数,有符号64位)或f(任意精度十进制)。我不知道,但我会猜测这可能是由于很难判断一个数字是否能表示为浮点十进制。
可能允许您强制这种做法,但我认为讨论这个问题最好的地方可能是在https://github.com/cognitect/transit-js/issues或https://github.com/cognitect/transit-cljs/issues。