我需要一个将被转换为普通 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/