f# - 让 WebSharper 生成简单的字段访问

标签 f# websharper

我需要一个将被转换为普通 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: error : Failed to translate property access: 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 返回一个空对象。这个问题现在开始看起来很像错误报告,对吧?那么,回到问题。

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

最佳答案

记录式构造函数“{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)

关于f# - 让 WebSharper 生成简单的字段访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16035713/

相关文章:

f# - Webshaper 应用程序性能下降,可能存在内存泄漏

c# - 在 F# 中命名元组/匿名类型?

f# - Seq.find 大量崩溃(int64)

javascript - 如何与 WebSharper 交互和设置 DOM 属性?

WebSharper 中的 JavaScript 函数签名

f# - WebSharper:不透明类型,具有 `===` 的相等性检查

angularjs - WebSharper 与 Angular

F# 基于连续的尾递归

sql - F# 将列表插入 SQL Server

.net - F#尾递归调用