2 ответа

Лучший ответ

Вы видите эту ошибку из-за того, что Elmish.Debugger использует Thoth.Json для сериализации вашей Msg / Model в формат JSON.

Тип WsSender не может быть представлен в формате JSON, потому что это функция. Так Thoth.Json просит вас объяснить, как он должен кодировать этот тип.

Вы можете сделать это, создав то, что называется extraCoder следующим образом:

В вашем случае вам нужно будет создать поддельный кодер / декодер "просто", чтобы сделать отладчик счастливым.

module CustomEncoders =

    let wsSenderEncoder (_ : WsSender) = Encode.string "WsSender function"

    let wsSenderDecoder = Decode.fail "Decoding is not supported for WsSender type"

    let myExtraCoders =
        Extra.empty
        |> Extra.withCustom wsSenderEncoder wsSenderDecoder 


    let modelEncoder = Encode.Auto.generateEncoder(extra = myExtraCoders)
    let modelDecoder = Decode.Auto.generateDecoder(extra = myExtraCoders)

При создании вашей Программы вы должны заменить Program.withDebugger на Program.withDebuggerCoders и передать ей созданный вами кодер и декодер.

Program.withDebuggerCoders CustomEncoders.modelEncoder CustomEncoders.modelDecoder
1
Maxime Mangel 20 Апр 2020 в 19:48

У меня была небольшая тренировка, чтобы попытаться придумать что-нибудь, что облегчит иметь несколько дополнительных кодеров, если потребуется. Кажется, это работает - думал, что это может быть полезно для других.


module CustomEncoders =

    let inline addDummyCoder<'b> extrasIn =
        let typeName = string typeof<'b>
        let simpleEncoder(_ : 'b) = Encode.string (sprintf "%s function" typeName)
        let simpleDecoder = Decode.fail (sprintf "Decoding is not supported for %s type" typeName)
        extrasIn |> Extra.withCustom simpleEncoder simpleDecoder

    let inline buildExtras<'a> extraCoders =
        let myEncoder:Encoder<'a> = Encode.Auto.generateEncoder(extra = extraCoders)
        let myDecoder:Decoder<'a> = Decode.Auto.generateDecoder(extra = extraCoders)
        (myEncoder, myDecoder)

type TestType = Msg -> Unit
type TestType2 = string -> Unit

let extras = Extra.empty
                |> CustomEncoders.addDummyCoder<TestType>
                |> CustomEncoders.addDummyCoder<TestType2>
                |> CustomEncoders.buildExtras<Model.Model>


#if DEBUG
open Elmish.Debug
open Elmish.HMR
#endif


Program.mkProgram Model.init Model.update View.render
|> Program.withSubscription subs 
#if DEBUG
|> Program.withConsoleTrace
#endif
|> Program.withReactBatched "elmish-app"
#if DEBUG
|> Program.withDebuggerCoders (fst extras) (snd extras)
#endif
|> Program.run


Если у кого-то есть лучшее представление о том, как это сделать, я буду рад обновить этот ответ своими предложениями. Кроме того, апостроф в универсальном типе, кажется, расстраивает префтификатор кода выше - нужно ли что-то делать, чтобы это исправить?

0
Andrew Willshire 20 Апр 2020 в 23:49