Hallo, ich habe einige Probleme beim Schreiben von Bindungen für eine kleine React-Komponente. Ich habe einen typischen Union-Typ mit Fällen, die Requisiten für die Komponente darstellen. Einer dieser Fälle sieht aus wie Tabs of ITab list
. Wenn ich versuche, eine Liste dieser Requisiten in ein Objekt mit keyValueList
umzuwandeln, funktioniert es gut, bis ich die Requisite Tabs
hinzufüge, wo das JavaScript dann einen Fehler mit der Aufschrift Cannot infer key and value of [object Object]
.
open Fable.Core
open Fable.Core.JsInterop
type ITab =
{ Name: string
Selected: bool }
type Props =
| Tabs of ITab list
| Title of string
let tab = { Name = "Hello"; Selected = true }
let works = keyValueList CaseRules.LowerFirst [Title "My Title"]
let doesNotWork = keyValueList CaseRules.None [Tabs [tab]; Title "My Title"]
Ich würde erwarten, dass der doesNotWork
keinen Fehler auslöst und ein Objekt generiert, das wie folgt aussieht:
var doesNotWork = {
title: "My Title",
tabs: [
{
name: "Hello",
selected: true
}
]
}
dotnet fable --version
): 1.3.0Sie können Ihr Problem beheben, indem Sie ein Array verwenden:
open Fable.Core
open Fable.Core.JsInterop
type ITab =
{ Name: string
Selected: bool }
type Props =
| Tabs of ITab array
| Title of string
let tab = { Name = "Hello"; Selected = true }
let works = keyValueList CaseRules.LowerFirst [Title "My Title"]
let doesNotWork = keyValueList CaseRules.None [Tabs [| tab |]; Title "My Title"]
Das Problem tritt auf, weil Json/JObject keinen Listentyp verwenden, der ein Objekt zur Laufzeit ist. Json/Jobject kennt nur Arrays.
Danke schön! Ich war mir dieser Einschränkung nicht bewusst, jetzt funktioniert alles, nachdem ich auf Array umgestellt habe.
Ja, tatsächlich, wenn Sie eine Liste verwenden, wird keyValueList
interpretieren, dass es sich um eine verschachtelte keyValueList handelt, wie im Fall von Style
:
div [ClassName "foo"
Style [BackgroundColor "red"
Width "500px"]] []
Hilfreichster Kommentar
Sie können Ihr Problem beheben, indem Sie ein Array verwenden:
Das Problem tritt auf, weil Json/JObject keinen Listentyp verwenden, der ein Objekt zur Laufzeit ist. Json/Jobject kennt nur Arrays.