使用部分定义或默认定义“类型别名”

Define `type alias` with a partial definition or default

有办法干掉这个吗?

我不想重复contents : List NavwrapperId : 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 }

是的,有!您可以将公共字段移动到单独的记录中并向其添加行变量。指定剩余字段的行变量 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

将接受 InputModelModel,或任何其他至少包含 CommonModel 指定字段的记录。将推断行变量,就像任何其他类型变量一样。