gpt4 book ai didi

scala.js - 是否可以忽略仅限 JVM 的属性并安全地导出到 JavaScript?

转载 作者:行者123 更新时间:2023-12-01 02:02:11 25 4
gpt4 key购买 nike

我在此之后有一个基本的项目设置 Play with ScalaJS example .我发现使用相同模式的其他示例会将案例类(模型)与传统上是它们的伴生对象分开。也就是说,案例类将存在于“共享”子项目中,而“伴随对象”(实际上只是某个对象)将存在于“服务器”子项目中。

最好将这两个文件保存在同一个文件中(即将重要的东西放在真正的伴生对象中),因为将类型类实例放在那里并让它们正确解析非常方便。例如:

case class User(id: Int, name: String)

object User {

val default = User(1, "Guest")

// I need this for the back-end, but don't need to export to JS
implicit val reads: Reads[User] = ...
}

不幸的是,这会导致链接错误,如 Reads类型仅存在于 JVM 上(只是众多类型中的一种)。但是,如果我要搬家 val reads进入不同的文件,隐式解析 Reads[User]会中断整个“服务器”子项目,而不添加显式导入(这会很烦人)。

是否可以显式忽略 ScalaJS 导出中的某些属性,同时仍然允许它们为 JVM 编译?我想要 User要导出的 case 类,甚至可能是其伴随对象的其他属性,但其他仅存在于 JVM 上的属性可以被忽略,而不会中断前端。

最佳答案

我过去解决这个问题的方式(在 Scala.js 代码库本身中)是通过 PlattformExtensions混合到交叉编译对象中但对于 JVM 和 JS 不同的特征:

object User extends UserPlattformExtensions {
val default = User(1, "Guest")
}

在您的 JVM 项目中:
trait UserPlattformExtensions {
implicit val reads: Reads[User] = ???
}

在您的 JS 项目中:
trait UserPlattformExtensions

在您的文件组织中(使用标准交叉项目),这将如下所示:
project/
shared/
src/main/
User.scala
jvm/
src/main/
UserPlattformExtensions.scala
js/
src/main/
UserPlattformExtensions.scala

没有依赖性问题,因为对于编译器来说,源文件的组装方式如下:
sources in projectJVM:
shared/src/main/User.scala
jvm/src/main/UserPlattformExtensions.scala

sources in projectJS:
shared/src/main/User.scala
jvm/src/main/UserPlattformExtensions.scala

因此,对于每个单独的编译运行,整个构造只是一个继承自 trait 的对象。源来自哪个源目录与编译无关。

关于scala.js - 是否可以忽略仅限 JVM 的属性并安全地导出到 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35330739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com