之前我使用过类型,但不知道opaque类型是什么。我也看过它。暴露opaque类型比使用类型别名更好吗?
答案 0 :(得分:15)
让我们首先看一下类型别名来回答这个问题:
类型别名是完全透明的。这意味着导入它的任何其他模块都可以完全访问其内部工作。假设我们有一个User
模块,显示User
类型:
module User exposing User
type alias User =
{ userName : String
, age : Int
}
导入User
的任何人都可以操纵数据,例如newUser = { oldUser | age = 25 }
。或者做someUser = User "Bill" 27
。当您控制它们存在的上下文时,这些操作就可以了。
但是,如果User
是库的一部分,那么对User
类型的每次更改都是对使用该库的人的重大更改。例如,如果将email
字段添加到User
,则构造函数示例(someUser = User "Bill" 27
)将给出编译器错误。
即使在项目代码库内部,类型别名也可以向其他模块提供过多信息,从而导致代码难以维护和发展。也许User
在某些时候会发生巨大变化,并且拥有一组全新的属性。这需要在代码操作User
的任何地方进行更改。
不透明类型很有价值,因为它们避免了这些问题。这是User
的不透明版本:
module User exposing User
type User =
User
{ userName : String
, age : Int
}
使用此版本,其他模块无法直接访问或操作数据。通常,这意味着您将制作并公开一些吸气剂和功能:
initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User
这是更多的工作,但它有优势:
User
函数,不需要知道类型中的数据大部分解释来自@wintvelt:elmlang.slack.com