在Elm中,没有原生的方式来对自定义类型进行编码。这使得向JS发送和接收自定义类型的值变得困难。我困惑了好一阵子,不知道如何处理像下面这样的简单自定义类型?
type MyCustomType
= A
| B
| C
这里有一个快速简单的演示,如何对任何自定义类型进行编码和解码。
说你有一个这样的自定义类型。
type MyCustomType
= A
| B
| C
你可以对其进行编码 MyCustomType
直接作为一个字符串。
encodeMyCustomType : MyCustomType -> Encode.Value
encodeMyCustomType myCustomType =
Encode.string <|
case myCustomType of
A -> "A"
B -> "B"
C -> "C"
解码 MyCustomType
是稍微多一点的参与。您需要使用 Decode.andThen
来检查找到了哪种变体,并使用 Decode.fail
如果没有找到有效的变种。
Decode.string |>
Decode.andThen
(\str ->
case str of
"A" -> Decode.succeed A
"B" -> Decode.succeed B
"C" -> Decode.succeed C
_ -> Decode.fail "Invalid MyCustomType"
)