我有一些带有“type”属性的JSON,我想导入Elm。例如,{ "id": "abc", "type": "thing" }
但是,如果我使用type
作为属性定义类型别名,编译器会抱怨。如,
type alias Foo = {
id: String
, type: String
}
产生
It looks like the keyword `type` is being used as a variable.
3│ , type: String
^
Rename it to something else.
真的?我必须重命名该属性?有没有办法引用或逃避它,所以它会编译?
答案 0 :(得分:7)
是的,type
是保留关键字,不能用作记录中的字段名称。
在Elm和Haskell中,在你的案例中最常见的做法似乎是附加单引号,因此它变为type'
,你的类型定义变为
type alias Foo =
{ id: String
, type': String
}
这源于数学的prime symbol。它起初可能看起来很奇怪,但它是有效的语法。
然后,您可以使用以下Json解码器将JSON转换为Foo:
fooDecoder =
Json.object2
Foo
("id" := Json.string)
("type" := Json.string)
请注意,Elm中的确切字段名称不需要与JSON字段名称匹配。
您很少会找到一种语言,可让您将关键字用作未转义的变量名称。这种行为并非榆树独有。
答案 1 :(得分:2)
在oscpad中,我使用"类型"我的json界面中的字段在websockets上。但是我没有在榆树记录中有一个叫做类型的字段。我只是寻找"类型"我正在解析JSON时的字段。我的代码如下所示:
jsSpec : JD.Decoder Spec
jsSpec =
("type" := JD.string) `JD.andThen` jsCs
jsCs : String -> JD.Decoder Spec
jsCs t =
case t of
"button" -> SvgButton.jsSpec `JD.andThen` (\a -> JD.succeed (CsButton a))
"slider" -> SvgSlider.jsSpec `JD.andThen` (\a -> JD.succeed (CsSlider a))
"label" -> SvgLabel.jsSpec `JD.andThen` (\a -> JD.succeed (CsLabel a))
"sizer" -> jsSzSpec `JD.andThen` (\a -> JD.succeed (CsSizer a))
_ -> JD.fail ("unkown type: " ++ t)
答案 2 :(得分:1)
您现在可以在下划线后对该关键字进行转义。
例如。
type alias Foo =
{ id: String
, type_: String
}
答案 3 :(得分:-1)
没有逃脱。榆树毫不妥协。