代码之家  ›  专栏  ›  技术社区  ›  Jean-Philippe Pellet

在Scala。js,如何最好地创建符合js外观特征的对象?

  •  4
  • Jean-Philippe Pellet  · 技术社区  · 7 年前

    @native
    trait Link extends Object {
      val href: String = native
      val title: String = native
    }
    

    use(...).as[...]

    val link = js.use(new {
      val href = "value1"
      val title = "value2"
    }).as[Link]
    

    但这会产生错误:

    AnyRef{val href:String;val title:String}不导出getter href:String

    为什么?

    我也试过了,果然失败了:

    val link = js.use(js.Dynamic.literal(
      href = cap(2),
      title = cap(3)
    )).as[Link]
    

    给予

    最后,我还尝试了以下方法:

    val link = new Link {
      override val href = "value1"
      override val title = "value2"
    }
    

    斯卡拉。js定义的js类不能直接扩展本机js特征

    现在,我正在这样做:

    val link = js.Dynamic.literal(
      href = "value1",
      title = "value2"
    ).asInstanceOf[Link]
    

    这是可行的,但如果我没弄错的话,编译器不会检查它。

    1 回复  |  直到 7 年前
        1
  •  6
  •   sjrd    7 年前

    图书馆应声明 Link @ScalaJSDefined 而不是 @js.native 。这将允许您执行第三种变体(带 new Link { ... }

    作为一种变通方法,要么做你正在做的事情 .asInstanceOf[Link] js.use(x).as[T] 安全,请使用:

    @ScalaJSDefined
    trait LinkImpl extends js.Object {
      val href: String
      val title: String
    }
    
    val link = js.use(new LinkImpl {
      val href = "value1"
      val title = "value2"
    }).as[Link]