scala js意外检查导致未定义的行为

scala js意外检查导致未定义的行为,scala,scala.js,Scala,Scala.js,运行编译成Scala js版本0.8.0的以下Scala代码,我得到以下错误: 检测到未定义的行为:未定义的不是java.lang.String的实例 trait MyDataType extends js.Any { var wordy: String = js.native } // This usually comes from the backend. val dataStruct = js.Dynamic.literal().asInstanceOf[MyDataType] val

运行编译成Scala js版本0.8.0的以下Scala代码,我得到以下错误:
检测到未定义的行为:未定义的不是java.lang.String的实例

trait MyDataType extends js.Any {
  var wordy: String = js.native
}
// This usually comes from the backend.
val dataStruct = js.Dynamic.literal().asInstanceOf[MyDataType]
val isWordy = dataStruct.wordy
经调查,上述代码编译为:

var dataStruct = {};
var isWordy  = $as_T(dataStruct["wordy"]); // Line causing problem.
显然,正是因为这个
$as\u T
才导致了这个问题。 如何确保上面的代码未选中

编辑我发现了一个不太优雅的解决方法

val isWordy = dataStruct.asInstanceOf[js.Dynamic].wordy

但是,为什么这个
$as\T

我认为这个问题是错误的。说
asInstanceOf[MyDataType]
就是告诉Scala进行类型检查。这几乎就是它的意思。当它进行类型检查时,它会进行完全的类型检查:您告诉Scala.js这是MyDataType的一个实例,因此它必须完全符合MyDataType

因此,如果您真的不想检查它的类型,正确的解决方案就是将
asInstanceOf
。在这一点上,它是一个JavaScript动态,您可以用它做任何事情

(或者您需要在
literal()
中为
wordy
分配一些内容,以便它实际上是
MyDataType

换句话说,Scala.js有两个立足点:非类型化JavaScript和强类型Scala。两者都能很好地工作,但在任何给定的时间,你都必须选择你正在操作的那一个


预计到达时间:一点理由。强类型语言的全部要点是,代码中的所有内容都确切地知道类型的结构——这样,您只需担心代码中的错误,而不必担心坏数据。这就是为什么需要对
的安装进行硬评估的原因:因此,如果您将值传递给某个需要
MyDataType
的函数,它肯定知道定义了
wordy

我认为问题的方向是错误的。说
asInstanceOf[MyDataType]
就是告诉Scala进行类型检查。这几乎就是它的意思。当它进行类型检查时,它会进行完全的类型检查:您告诉Scala.js这是MyDataType的一个实例,因此它必须完全符合MyDataType

因此,如果您真的不想检查它的类型,正确的解决方案就是将
asInstanceOf
。在这一点上,它是一个JavaScript动态,您可以用它做任何事情

(或者您需要在
literal()
中为
wordy
分配一些内容,以便它实际上是
MyDataType

换句话说,Scala.js有两个立足点:非类型化JavaScript和强类型Scala。两者都能很好地工作,但在任何给定的时间,你都必须选择你正在操作的那一个


预计到达时间:一点理由。强类型语言的全部要点是,代码中的所有内容都确切地知道类型的结构——这样,您只需担心代码中的错误,而不必担心坏数据。这就是为什么需要对
的安装进行硬评估的原因:因此,如果您将值传递给某个需要
MyDataType
的函数,它肯定知道定义了
wordy

此外,您的问题的另一个解决方案是修复
MyDataType
,以便它对
wordy
可能不存在的事实进行编码。为此,请将其键入
var-wordy:js.UndefOr[String]
。在这种情况下,您的测试将变成
val isWordy=dataStruct.wordy.isDefined
。谢谢你,Seb,这正是我想要的。此外,解决您问题的另一种方法是修复
MyDataType
,这样它就可以对
wordy
可能不存在的事实进行编码。为此,请将其键入
var-wordy:js.UndefOr[String]
。在这种情况下,您的测试将变成
val isWordy=dataStruct.wordy.isDefined
。谢谢Seb,这正是我要找的。