/ / ScalaJS: Фасад для поліморфного об’єкта - scala.js

ScalaJS: Фасад для поліморфного об’єкта - scala.js

Я хотів би викликати із ScalaJS функцію JS, подібну до наведеної нижче:

function parseExpression(s){
if(isNumber(s)) return {lit:s}
else{
return {
left : leftOp(s)
oper : operand(s)
right: rightOp(s)
}
}
}

де повернутий об'єкт може мати дві різні форми {lit} або {left, oper, right}

У ScalaJS я визначив такі риси:

@js.native
trait NumLiteral extends js.Object{
val lit:String = js.native
}

@js.native
trait NumOper extends js.Object{
val left : NumLiteral | NumOper = js.native
val oper : String = js.native
val right: NumLiteral | NumOper = js.native
}

тоді я можу оголосити функцію parseExpression як Function1[String, NumLiteral | NumOper]

Який найкращий спосіб перевірити, чи повертається значення parseExpression(someExpressionString) є типу NumLiteral або NumOper? Я можу змінити код JS та / або Scala, щоб досягти найбільш елегантного рішення.

Відповіді:

0 для відповіді № 1

Я вирішив це, визначивши в ScalaJS наступне:

trait NumExpr

@JSExport
class NumLiteral(val lit:String) extends NumExpr

@JSExport
class NumOper(val left:NumExpr, val oper:String, val right:NumExpr) extends NumExpr

а потім перевизначити мою функцію JS:

function parseExpression(s){
return isNumber(s) ?
new NumLiteral(s) :
new NumOper(leftOp(s), operand(s), rightOp(s))
}

Це дозволяє мені збігати шаблон parseExpression(someExpressionString)

Звичайно, це змінює оригінальну функцію JS і, отже, вихідне питання, але це вирішило мою проблему.