榆树:类型别名JSON与“类型”属性

问题描述 投票:6回答:4

我有一些JSON与我想要导入到榆树“类型”属性。例如,{ "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.

真的吗?我不得不重新命名的财产?难道就没有办法引用或逃避它,所以它会编译?

elm
4个回答
7
投票

是的,type是保留关键字,不能用作一个记录的字段名。

在榆树和Haskell,你的情况做最普通的事情似乎是追加单引号,因此它成为type',和你的类型定义变

type alias Foo =
  { id: String
  , type': String
  }

这有它从数学的起源prime symbol。它可能看起来很奇怪在第一,但它是有效的语法。

然后,您可以使用下面的Json解码器到JSON转化为富:

fooDecoder =
  Json.object2
    Foo
    ("id" := Json.string)
    ("type" := Json.string)

请注意,在榆树的确切字段名并不需要匹配的JSON字段名。

很少会找到一个语言,让您使用关键字作为变量名转义。这种行为是不是唯一的榆树。


2
投票

在oscpad,我用我的WebSockets以上JSON接口“类型”字段。但我没有叫类型的榆树记录字段。我只是看的时候我解析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)

1
投票

现在,您可以逃脱用下划线的关键字。

恩。

type alias Foo =
  { id: String
  , type_: String
}

-1
投票

跑不了的。榆树是各执一词。

© www.soinside.com 2019 - 2024. All rights reserved.