2

在打字稿中它看起来像这样

type Option<T> = {some: T} | 'none'
type Optional<T> = {
  [P in keyof T]: Option<T[P]>
};
type Foo = {x: string, y: number}
type OptionalFoo = Optional<Foo>
const foo: OptionalFoo = {x: 'none', y : {some: 123}}
case class Foo(x: String, y: Int)

我想拥有

type OptionalFoo = Optional[Foo] == case class OptionalFoo(x: Option[String], y: Option[Int])

是否有可能在 Scala 3 中实现这样的目标?

4

1 回答 1

1

如果您不关心每个字段的名称,您可以这样做:

type Foo = (String, Int)
type Optional[T <: Tuple] = Tuple.Map[T, Option]
type OptionalFoo = Optional[Foo]

val optionalFoo: OptionalFoo = (Some("foobar"), None)
optionalFoo match {
  case (x, y) => println(s"x is $x, y is $y")
}

斯卡斯蒂

这在支持注释宏的 Scala 2 中可能是可能的。也许类型类派生在这里也可以帮助您。如果您不关心实际创建一个全新的案例类,Shapeless也有许多有用的机制。

于 2021-01-20T14:28:33.507 回答