我需要一个将被转换为普通JS对象的类型,以便将F#字段访问转换为简单的JS字段访问(这是必要的,因为该对象将通过postMessage
发送,所以它'将失去所有方法。)
同样,我需要
let x = a.b
被翻译成
var x = a.b;
没有任何方法调用。
以下是F#Reference:
中略有修改的示例namespace T
open IntelliFactory.WebSharper
[<JavaScript>]
module A =
type MyClass =
val a : int
val b : int
new(a0, b0) = { a = a0; b = b0; }
let myClassObj = new MyClass(35, 22)
let x = myClassObj.b
这不会转换为
x:错误:无法翻译属性访问权限:b。'
好的,让那些val
可变:
namespace T
open IntelliFactory.WebSharper
[<JavaScript>]
module A =
type MyClass =
val mutable a : int
val mutable b : int
new(a0, b0) = { a = a0; b = b0; }
let myClassObj = new MyClass(35, 22)
let x = myClassObj.b
这将成功翻译,但是...... MyClass.New
会返回一个空对象。这个问题现在看起来很像一个bug报道,对吧?所以,回到问题。
还有其他方法可以实现我的目标吗?
答案 0 :(得分:1)
记录样式构造函数“{x = y}”还有其他问题。我将不得不在F#3.0上再次研究这个问题,旧的F#没有为那些产生合理的报价,我们在WebSharper中做了一些部分的解决方法。现在你的例子破了。所以这是使用静态方法而不是构造函数的工作代码:
type MyClass private () =
[<DefaultValue>]
val mutable a : int
[<DefaultValue>]
val mutable b : int
static member Create(a0, b0) =
let c = MyClass()
c.a <- a0
c.b <- b0
c
let test () =
let myClassObj = MyClass.Create(35, 22)
let x = myClassObj.a
let y = myClassObj.b
JavaScript.Log(x, y)
平凡地说,记录也可以。
在某些情况下,如果您想要进行非常低级别的操作,可以使用Inline属性注释成员。当这是太多开销时,您可以使用无类型API:
let x = obj ()
x?a <- 1
let y = x?a
JavaScript.Log(x, y)
答案 1 :(得分:0)
试试这个:
type MyClass (a, b) =
member val A = a with get
member val B = b with get
let myClassObj = new MyClass(35, 22)
let x = myClassObj.B