3

F# フィールド アクセスが単純な JS フィールド アクセスに変換されるように、単純な 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.'

valでは、これらの sを変更可能にしましょう。

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 に答える