Определить `псевдоним типа 'с частичным определением или по умолчанию
Есть ли способ высушить это?
Я не хочу повторяться contents : List Nav
а также wrapperId : String
type alias InputModel =
{ contents : List Nav
, containerClassName : Maybe String
, wrapperId : String
}
type alias Model =
{ contents : List Nav
, containerClassName : String
, wrapperId : String
}
modelWithDefaults : InputModel -> Model
modelWithDefaults input =
{ input | containerClassName = withDefault "" input.containerClassName }
1 ответ
Решение
Да, есть! Вы можете переместить общие поля в отдельную запись и добавить в нее переменную строки. Переменная строки, a
, которые определяют оставшиеся поля, могут быть предоставлены позже:
type alias CommonModel a =
{ a
| contents : List Nav
, wrapperId : String
}
type alias InputModel =
CommonModel
{ containerClassName : Maybe String }
type alias Model =
CommonModel
{ containerClassName : String }
Вы также можете использовать переменные строки для написания функций, которые принимают любую запись, если она имеет общие поля. Например
getWrappedId : CommonModel a -> String
getWrapperId { wrapperId } = wrappedId
примет оба InputModel
а также Model
или любая другая запись, которая содержит хотя бы поля, указанные CommonModel
, Переменная строки будет выведена, как и любая другая переменная типа.