Elixir - 可以组合自定义地图类型吗?
Elixir - possible to combine custom map types?
在 Elixir 模块中定义类型时,是否可以合并两种不同的映射类型,其中一种是另一种的子集?例如:
defmodule Test do
@typep map_a :: %{foo: String.t(), bar: String.t()}
@typep map_b :: %{foo: String.t(), bar: String.t(), baz: String.t()}
end
我想指出 map_b
类型是一个映射,它本质上是 map_a()
的实例加上附加的 baz
键。我尝试了 Map.merge(map_a(), %{baz: String.t})
- 编译,但是当我通过 t(Test)
检查类型时,我只是准确地找回了我写的内容,
@typep map_b :: Map.merge(map_a(), %{baz: String.t})
这并没有让我深入了解这是否真的符合我的目标。
使用 Map.merge/2
(或类似的东西)组合自定义地图类型是一种有效的方法吗?如果没有,如何实现?
Map.merge/2
对规格不起作用,它实际上不是地图,只是类似的语法。
通过一些元编程可能会达到预期的结果。
defmodule Test do
@map_a_type quote(do: [foo: String.t(), bar: String.t()])
@typep map_a :: %{unquote_splicing(@map_a_type)}
@typep map_b :: %{unquote_splicing(@map_a_type), baz: String.t()}
end
在 Elixir 模块中定义类型时,是否可以合并两种不同的映射类型,其中一种是另一种的子集?例如:
defmodule Test do
@typep map_a :: %{foo: String.t(), bar: String.t()}
@typep map_b :: %{foo: String.t(), bar: String.t(), baz: String.t()}
end
我想指出 map_b
类型是一个映射,它本质上是 map_a()
的实例加上附加的 baz
键。我尝试了 Map.merge(map_a(), %{baz: String.t})
- 编译,但是当我通过 t(Test)
检查类型时,我只是准确地找回了我写的内容,
@typep map_b :: Map.merge(map_a(), %{baz: String.t})
这并没有让我深入了解这是否真的符合我的目标。
使用 Map.merge/2
(或类似的东西)组合自定义地图类型是一种有效的方法吗?如果没有,如何实现?
Map.merge/2
对规格不起作用,它实际上不是地图,只是类似的语法。
通过一些元编程可能会达到预期的结果。
defmodule Test do
@map_a_type quote(do: [foo: String.t(), bar: String.t()])
@typep map_a :: %{unquote_splicing(@map_a_type)}
@typep map_b :: %{unquote_splicing(@map_a_type), baz: String.t()}
end