微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否可以在 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 也有许多有用的机制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。