3

我需要一种将被转换为普通 JS 对象的类型,以便将 F# 字段访问转换为简单的 JS 字段访问(这是必要的,因为对象将通过 发送postMessage,因此它将丢失所有方法)。

再次,我需要

let x = a.b

被翻译成

var x = a.b;

没有任何方法调用。

下面是 F# 参考中稍作修改的示例:

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。

好的,让我们让这些vals 可变:

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返回一个空对象。现在问题开始看起来很像错误报告,对吗?所以,回到问题。

还有其他方法可以实现我想要的吗?

4

2 回答 2

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)
于 2013-04-17T12:06:53.487 回答
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
于 2013-04-16T12:01:32.757 回答