从这三个声明开始:
type SharedMsg
= SharedAction
type Page1Msg
= Page1Action
type Page2Msg
= Page2Action
我有办法获得相当于以下内容的方法吗?就像一种“合并”联合类型的方法?
type Msg
= SharedAction
| Page1Action
| Page2Action
=============================
上下文:我将 Elm 应用程序拆分为每页一个模块,并带有自己的文件夹。
有些操作将是共享的,有些操作将是特定于页面的。
如果我要使用Html.map
方法,我觉得我必须重写页面在其自己的中使用的每个共享操作PageMsg
消息类型:
type Page1Msg
= Page1Action
| SharedAction
type Msg
= Page1Msg Page1Msg
| Page2Msg Page2Msg
view : Model -> Html Msg
view =
Html.map Page1Msg (Page1View.view model)
因此我想到使用一种独特的Msg
为所有页面键入内容,但通过在自己的文件夹中写入特定于页面的消息来保持模块化,然后以某种方式定义唯一的Msg
通过合并它们来键入。
@z5h的答案几乎是正确的,但类型构造函数必须有不同的名称。
您无法按照您想要的方式合并类型。
至于惯用的方式:您可以将分割类型命名为Msg
, not Page1Msg
。因此,例如:
第1页.elm:
module Page1 exposing (Msg)
type Msg
= Foo
第2页.elm:
module Page2 exposing (Msg)
type Msg
= Bar
共享.elm:
module Shared exposing (Msg)
type Msg
= Baz
主要.elm:
module Main exposing (..)
import Shared
import Page1
import Page2
type Msg
= SomethingCustom
| SharedMsg Shared.Msg
| Page1Msg Page1.Msg
| Page2Msg Page2.Msg
顺便说一下,请记住,如果将模块分成Page1.View
, Page1.Types
等等,那么只要暴露的函数不重叠,就可以导入同名的不同模块,即:
import Page1.Types as Page1
import Page1.State as Page1
import Page1.View as Page1
import Page1.Decoders as Page1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)