【问题标题】:make creating non-native JS trait instances easier in scala.js with scala.meta使用 scala.meta 在 scala.js 中更轻松地创建非原生 JS 特征实例
【发布时间】:2018-02-14 19:26:46
【问题描述】:

我创建了很多非本地 JS 特征实例作为 javascript 函数的参数

trait ElementOpts extends js.Object {
  val prop1: js.UndefOr[String] = js.undefined
  // another 10-15 vals
}

创建实例:

createElement(new ElementOpts {
  override val prop1 = "value1"
  override val prop2 = "value2" 
  // several more, maybe not *all* possible vals
})

但是,在使用覆盖值等定义这些时会有很多打字噪音。

最好只键入一个键值对列表并将其转换为经过类型检查的 trait,这样您就不会意外添加未在 trait 中定义的 val:

lit[ElementOpts](prop1="value1",prop2="value2")

并将其转换为上述“新 ElementOpts”语法。我使用“lit”来暗示 javascript 文字对象。

scalameta 能做到这一点吗?如果是这样,是否有类似的例子?或者这应该在某种预处理器中处理。

【问题讨论】:

  • 请注意,在此herehere 之前已经有cmets。

标签: scala.js scalameta


【解决方案1】:

vars 代替vals 定义你的ElementOpts,然后你可以简单地这样做:

createElement(new ElementOpts {
  prop1 = "value1"
  prop2 = "value2"
  // several more, maybe not *all* possible vars
})

【讨论】:

  • 这对我有用。提醒其他人,如果您有一个必需的属性,您仍然可以将其设置为“val requiredProp: String”,以强制它出现在“new”下。
  • 如果我需要类型参数,尽管我仍然必须使用一个 def,它变成了一个 getter,但它不起作用……那么这如何适用于 def "trait ElementOpts[T <: dom. eventtarget def onkeydown>: T <: dom.eventtarget js.undefor js.undefined ... defs>
  • 也许我们只需要找到一种方法来消除类型约束,以便获得“字段存在”检查与某些类型检查 - 这可能不是一个糟糕的权衡。
  • 像往常一样将其设为val/var,类型为js.FunctionN
  • 这是对 def 的类型约束,因为 trait 的 T 参数是协变的,我需要它是逆变的,因为它映射到逆变位置,“type KeyboardEventHandler[T <: dom.eventtarget eventhandler synthetickeyboardevent type e syntheticevent> Unit " 。这允许您在处理程序中使用更通用的事件对象,并且仍然让它进行类型检查,因为 SyntheticKeyboardEvent 在其参数中是协变的,因为它是从某些事件方法返回的。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2010-12-12
  • 2010-10-09
相关资源
最近更新 更多