Fable: Schlüssel und Wert von [Objekt Objekt] können nicht abgeleitet werden

Erstellt am 8. Dez. 2017  ·  3Kommentare  ·  Quelle: fable-compiler/Fable

Beschreibung

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] .

Repro-Code

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"]

Erwartete und tatsächliche Ergebnisse

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
    }
  ]
}

Verwandte Informationen

  • Fable-Version ( dotnet fable --version ): 1.3.0
  • Betriebssystem: Windows 10 Pro

Hilfreichster Kommentar

Sie 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.

Alle 3 Kommentare

Sie 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"]] []
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen