Ale*_*xHv 5 modularity elm union-types
从这三个声明开始:
type SharedMsg
= SharedAction
type Page1Msg
= Page1Action
type Page2Msg
= Page2Action
Run Code Online (Sandbox Code Playgroud)
我有办法获得相同的以下一个?就像一种"合并"联盟类型的方式?
type Msg
= SharedAction
| Page1Action
| Page2Action
Run Code Online (Sandbox Code Playgroud)
=============================
上下文:我将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)
Run Code Online (Sandbox Code Playgroud)
因此我考虑Msg为所有页面使用唯一类型,但通过在自己的文件夹中编写特定于页面的消息来保留模块性,然后以某种方式Msg通过合并它们来定义唯一类型.
@ z5h的答案几乎是正确的,但类型构造函数必须有不同的名称.
您无法按照自己喜欢的方式合并类型.
至于惯用的方式:你只是命名分裂类型Msg,而不是Page1Msg.所以,例如:
Page1.elm:
module Page1 exposing (Msg)
type Msg
= Foo
Run Code Online (Sandbox Code Playgroud)
Page2.elm:
module Page2 exposing (Msg)
type Msg
= Bar
Run Code Online (Sandbox Code Playgroud)
Shared.elm:
module Shared exposing (Msg)
type Msg
= Baz
Run Code Online (Sandbox Code Playgroud)
Main.elm:
module Main exposing (..)
import Shared
import Page1
import Page2
type Msg
= SomethingCustom
| SharedMsg Shared.Msg
| Page1Msg Page1.Msg
| Page2Msg Page2.Msg
Run Code Online (Sandbox Code Playgroud)
顺便说一下,请记住,如果将模块拆分为Page1.View,Page1.Types等等,那么只要暴露的函数不重叠,就可以使用相同的名称导入不同的模块,即:
import Page1.Types as Page1
import Page1.State as Page1
import Page1.View as Page1
import Page1.Decoders as Page1
Run Code Online (Sandbox Code Playgroud)