何时在Elm中使用类型别名与单值联合类型

neu*_*mic 2 type-alias elm union-types

我一直在读Richard Feldman的Elm SPA应用程序示例,我看到了很多这样的例子:

type Username
    = Username String
Run Code Online (Sandbox Code Playgroud)

而且我不确定何时使用类似的东西,单值联合类型,而不是像这样的类型别名:

type alias Username
    = String
Run Code Online (Sandbox Code Playgroud)

何时使用单值联合类型与仅使用类型别名是否合适?

Cha*_*ert 6

在适当的时候没有严格的规则,但我倾向于遵循一些经验法则.让我们使用一个带有用户名和密码的身份验证函数示例,这两个用户名和密码都是字符串值.

在最低限度,没有任何其他别名或类型,注释可能是这样的:

authenticate : String -> String -> Bool
Run Code Online (Sandbox Code Playgroud)

给定该注释,不清楚哪个参数是用户名,哪个是密码.我们可以通过使用类型别名来提高可读性:

type alias Username = String
type alias Password = String

authenticate : Username -> Password -> Bool
Run Code Online (Sandbox Code Playgroud)

这对我的软件包的消费者来说更好,但是类型别名不会禁止您在调用代码时意外地交换参数.例如,这个有问题的函数会编译:

login : Username -> Password -> Bool
login username password =
    if authenticate password username then ...
Run Code Online (Sandbox Code Playgroud)

如果你想走得更远一步,每次使用它的时候强制类型的明确声明,您能避免错误的类型,因为编译器将捕获mixups:

type Username = Username String
type Password = Password String
Run Code Online (Sandbox Code Playgroud)

使用该定义,您每次使用时都必须在Username或Password构造函数中显式解包和打包字符串.这对于诸如测量单位之类的东西特别有用,在这种情况下,这样的概念可以避免失去火星任务

正如你在Richard的例子中看到的那样,走完全类型和类型构造函数的路径意味着你需要单独的样板函数来进行json解码,编码等,这可能会变得乏味.您需要为您的团队和项目找到合适的平衡点.