是否可以在 Scala 3 中用类似于打字稿映射类型的另一种类型包装成员类型?

问题描述

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

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")
}

Scastie

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