使WebSharper生成简单的字段访问

时间:2013-04-16 11:20:14

标签: f# websharper

我需要一个将被转换为普通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报道,对吧?所以,回到问题。

还有其他方法可以实现我的目标吗?

2 个答案:

答案 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