在 Purescript 中建模 Javascript 对象

Modelling a Javascript object in Purescript

我正在尝试在 Purescript 中为来自 Firestore 的 SetOptions 数据类型建模。

到目前为止我有以下

foreign import data FieldPath :: Type

foreign import buildFieldPath :: Array String -> FieldPath

foreign import fieldNames :: FieldPath -> Array String

type MergeFields = Array (String \/ FieldPath)

data SetOptions
  = MergeOption Merge
  | MergeFieldsOption MergeFields

请注意 SetOptions 是求和类型,因为 mergemergeFields 是互斥的(即使没有记录)。

现在我需要将 SetOptions 转换为 Javascript 对象,以便我可以将其传递给 Javascript firebase 库中的某个函数。

它应该是某种形式

{
  "mergeFields": [
    "foo",
    new FieldPath("bar", "baz")
  ]
}

我的问题是这个类型。

我不能使用 Object,因为包含的数据不是同质的(merge 指的是布尔值,mergeFields 指的是数组)。

我不能使用 Json,因为我需要在结果中包含 FieldPath 个对象。

到目前为止我找到的唯一解决方案是返回一些 Json 然后在 javascript 端解析它并在需要的地方添加 FieldPath 对象,但它看起来很脏并且脆。

我可能会跳过 PS 端的余积 SetOption 表示,只提供这两个 "dirty" 构造函数:

foreign import data SetOption :: Type

merge :: Boolean -> SetOption
merge m = unsafeCoerce { merge: m }

mergeFields :: MergeFields -> SetOption
mergeFields mf = unsafeCoerce { mergeFields: mf }

我可能会对 MergeFields 副产品做同样的事情。

我们正在我们的社区项目中做类似的事情 - material ui 绑定:purescript-react-basic-mui。此外,我们将这些相关的构造函数分组到记录中以实现 "cheap namespacing",因为我们从打字稿声明生成所有这些绑定,但这在这种情况下并不重要。 请查看此示例模块中的一些定义:

https://github.com/purescript-react-basic-mui/purescript-react-basic-mui/blob/codegen-read-dts/src/MUI/Core/Badge.purs#L20

编辑:我认为 this latest discourse thread 可以为您@macrosh 提供很好的额外灵感。