类型构造函数的别名可以与类型相同吗?

时间:2017-12-05 14:56:04

标签: f#

请考虑以下事项:

module Module1 =

  type Foo = Bar | Baz

  type Lorem = {Ipsum: int}

module Module2 =

  type Foo = Module1.Foo
  type Lorem = Module1.Lorem

  let foo = Bar // Error: The value or constructor 'Bar' is not defined

  let lorem = {Ipsum = 2} // Error: The record label 'Ipsum' is not defined

是否可以以简单的方式对类型进行别名,并且仍然能够在不打开Module1的情况下实际构建它们?

后台:我正在创建一个应用和相应的网络API。他们将通过序列化和反序列化POCO(POFO?)来相互交谈,POCO的定义在应用程序和Web API引用的项目中的模块(对应Module1)中可用。 API和类型已经过版本控制,因此我希望在应用和网络API中有一个Types模块(对应于Module2),其中我只是为最新版本的API添加别名类型(例如type Foo = Shared.V2.Foo),然后我在app和API中使用这些别名,因为这意味着我不需要在整个app / API中引用特定版本。 (如果这是一个可怕的想法,请拍我。)

1 个答案:

答案 0 :(得分:3)

您的类型别名在现有代码中完全未使用。如果您通过限定这些标识符来明确使用它们,则可以使用它:

let foo = Foo.Bar

let lorem = {Lorem.Ipsum = 2}