文档 / 语言手册 / 可扩展变体
Edit

可扩展变体

变体类型通常被限制于一组构造器的固定集合。在极少数情况下,你可能想在初始化类型声明后给变体类型添加构造器。为此,我们提供了可扩展变体(Extensible Variant)类型。

定义与使用

ReScriptJS Output
type t = ..

type t += Other

type t +=
  | Point(float, float)
  | Line(float, float, float, float)

在上面的类型声明中我们用 .. 定义了一个可扩展变体 type t。然后用 += 操作符为类型添加构造器。

注意:在使用 += 操作符时,不要忘记开头的 type 关键字。

模式匹配注意事项

可扩展变体是可开放式的,所以编译器无法穷尽所有可能的模式匹配情况。你总是需要为 switch 表达式提供一个默认的 _

ReScriptJS Output
let print = v =>
  switch v {
  | Point(x, y) => Js.log2("Point", (x, y))
  | Line(ax, ay, bx, by) => Js.log2("Line", (ax, ay, bx, by))
  | Other
  | _ => Js.log("Other")
  }

技巧和诀窍

有趣的事实:在 ReScript 中,异常 实际上是可扩展变体实现的,因此 exception UserError(string)type exn += UserError(string) 等价。这是极少数可扩展变体的有意义的用例之一。

我们通常建议尽可能使用普通变体,以获得无遗漏的模式匹配的好处。