Я хотів би викликати із 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 і, отже, вихідне питання, але це вирішило мою проблему.