Заставьте 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: ошибка: не удалось преобразовать доступ к свойствам: 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 возвращает пустой объект. Теперь вопрос начинает очень походить на отчет об ошибке, верно? Итак, вернемся к вопросу.

Есть ли другие способы добиться того, чего я хочу?


person kirelagin    schedule 16.04.2013    source источник


Ответы (2)


Существуют дополнительные проблемы с конструкторами в стиле записи "{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)

Тривиально, запись также будет работать.

В некоторых случаях, когда вы хотите перейти на очень низкий уровень, вы можете аннотировать элементы с помощью встроенного атрибута. Когда это слишком много, вы можете использовать нетипизированный API:

let x = obj ()
x?a <- 1
let y = x?a
JavaScript.Log(x, y)
person t0yv0    schedule 17.04.2013
comment
«статический метод вместо конструктора» именно так я пока и сделал… А что это за нетипизированная штука? Я не могу найти его ни в F #, ни в документах WebSharper. - person kirelagin; 17.04.2013

попробуй это:

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
person cja03    schedule 16.04.2013
comment
Вы сами пробовали? Методы получения свойств транслируются в методы get_*. - person kirelagin; 16.04.2013