在 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
是求和类型,因为 merge
和 mergeFields
是互斥的(即使没有记录)。
现在我需要将 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",因为我们从打字稿声明生成所有这些绑定,但这在这种情况下并不重要。
请查看此示例模块中的一些定义:
编辑:我认为 this latest discourse thread 可以为您@macrosh 提供很好的额外灵感。
我正在尝试在 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
是求和类型,因为 merge
和 mergeFields
是互斥的(即使没有记录)。
现在我需要将 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",因为我们从打字稿声明生成所有这些绑定,但这在这种情况下并不重要。
请查看此示例模块中的一些定义:
编辑:我认为 this latest discourse thread 可以为您@macrosh 提供很好的额外灵感。