问题描述
在打字稿中它看起来像这样
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 中实现这样的功能?
解决方法
如果您不关心每个字段的名称,您或许可以这样做:
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 中可能是可能的。也许 type class derivation 也可以在这里帮助您。如果您不关心实际创建一个全新的案例类,Shapeless 也有许多有用的机制。