Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Typescript: Problem mit getObject()

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    823

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Typescript: Problem mit getObject()

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 3 Kommentatoren 196 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • I Offline
    I Offline
    iob69
    schrieb am zuletzt editiert von
    #1

    Hallo,
    eines meiner (typescript) Scripte läuft nicht mehr weil es da einen Tranpilationsfehler gibt. Das Script ist aber schon gelaufen, nur gibt es neuerdings diesen Fehler. Ich nehme an, dass das mit dem Update des Javascript-Adapters zu tun hat?.

    Die Fehlerzeile:

    let deviceName:string = getObject(deviceId).common.name;
    

    Das Objekt sieht folgendermassen aus:

    {
      type: 'channel',
      common: { name: 'Taster_Markise' },
      _id: 'alias.0.Taster_Markise',
      native: {},
      from: 'system.adapter.admin.0',
      user: 'system.user.admin',
      ts: 1752846792596,
      acl: {
        object: 1636,
        owner: 'system.user.admin',
        ownerGroup: 'system.group.administrator'
      }
    }
    

    Fehlermeldung:

    TypeScript compilation failed:
                deviceName = getObject(deviceId).common.name;
                ^
    ERROR: Type 'StringOrTranslated' is not assignable to type 'string'.
      Type 'Translated' is not assignable to type 'string'.
    

    Frage ich zuerst das Objekt und dann ".common" ab, sagt der transpiler, dass common nicht existiere. Klar, typescript kennt diesen typ offenbar nicht (mehr?).
    Aber das Script lief schon.
    Die beschreibung in der Doku sagt mir leider auch nicht viel mehr.

    1 Antwort Letzte Antwort
    0
    • mcm1957M Online
      mcm1957M Online
      mcm1957
      schrieb am zuletzt editiert von mcm1957
      #2

      Vorab: Ich kenn mich mit typescript im javascritp Adapzter nicht aus aber

      Im State Object des cores kann common.name entweder ein einfacher String oder ein i18n Objekt ('{en:'english text', de:'deuter Text', ...} sein. Insofern erscheint es richtig dass TS meckert da da nicht zwingen ein String retourniert wird wenn du auf common.name zugreifst.

      Aber wie gesagt es kann sein, dass der javascritp Adapter da auch Datenstrukturen automatisch migriert (und z.b. nicht das originale state Object retourniert)

      Eventuell hat dein Skript bei einem ANDEREN Objekt funtkioniert wo wirklich nur ein String drinnen stand?

      Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
      Support Repositoryverwaltung.

      Wer Danke sagen will, kann nen Kaffee spendieren: https://paypal.me/mcm1957atiobroker

      LESEN - gute Forenbeitrage

      I 1 Antwort Letzte Antwort
      0
      • mcm1957M mcm1957

        Vorab: Ich kenn mich mit typescript im javascritp Adapzter nicht aus aber

        Im State Object des cores kann common.name entweder ein einfacher String oder ein i18n Objekt ('{en:'english text', de:'deuter Text', ...} sein. Insofern erscheint es richtig dass TS meckert da da nicht zwingen ein String retourniert wird wenn du auf common.name zugreifst.

        Aber wie gesagt es kann sein, dass der javascritp Adapter da auch Datenstrukturen automatisch migriert (und z.b. nicht das originale state Object retourniert)

        Eventuell hat dein Skript bei einem ANDEREN Objekt funtkioniert wo wirklich nur ein String drinnen stand?

        I Offline
        I Offline
        iob69
        schrieb am zuletzt editiert von
        #3

        @mcm1957 sagte in Typescript: Problem mit getObject():

        Im State Object des cores kann common.name entweder ein einfacher String oder ein i18n Objekt ('{en:'english text', de:'deuter Text', ...} sein. Insofern erscheint es richtig dass TS meckert da da nicht zwingen ein String retourniert wird wenn du auf common.name zugreifst.

        Ich weiss nicht ob das ein State Object des cores ist (normaler Datenpunkt, dem ich den Namen 'Taster_Markise' gegeben hab).
        Aber er kennt nicht mal 'common', denn das wollte ich abfragen:

        let obj = console.log(getObject(deviceId));
        let s:string = obj.common;
        

        fehler:

        TypeScript compilation failed:
                    let s: string = obj.common;
                                        ^
        ERROR: Property 'common' does not exist on type 'void'.
        

        @mcm1957 sagte in Typescript: Problem mit getObject():

        Eventuell hat dein Skript bei einem ANDEREN Objekt funtkioniert wo wirklich nur ein String drinnen stand?

        Nein, das script lief bis vor kurzem und den Fehler hab ich nun, weil ich herausfand dass das script nicht mehr läuft. Wahrscheinlich nun nach dem update (3 Tage).

        mcm1957M 1 Antwort Letzte Antwort
        0
        • T Nicht stören
          T Nicht stören
          ticaki
          schrieb am zuletzt editiert von
          #4

          Ja und die types werden immer genau - also das was mcm geschrieben hat.
          common.name kann ein string sein oder ein object - daher prüfen ob es ein string ist.

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          1 Antwort Letzte Antwort
          0
          • I iob69

            @mcm1957 sagte in Typescript: Problem mit getObject():

            Im State Object des cores kann common.name entweder ein einfacher String oder ein i18n Objekt ('{en:'english text', de:'deuter Text', ...} sein. Insofern erscheint es richtig dass TS meckert da da nicht zwingen ein String retourniert wird wenn du auf common.name zugreifst.

            Ich weiss nicht ob das ein State Object des cores ist (normaler Datenpunkt, dem ich den Namen 'Taster_Markise' gegeben hab).
            Aber er kennt nicht mal 'common', denn das wollte ich abfragen:

            let obj = console.log(getObject(deviceId));
            let s:string = obj.common;
            

            fehler:

            TypeScript compilation failed:
                        let s: string = obj.common;
                                            ^
            ERROR: Property 'common' does not exist on type 'void'.
            

            @mcm1957 sagte in Typescript: Problem mit getObject():

            Eventuell hat dein Skript bei einem ANDEREN Objekt funtkioniert wo wirklich nur ein String drinnen stand?

            Nein, das script lief bis vor kurzem und den Fehler hab ich nun, weil ich herausfand dass das script nicht mehr läuft. Wahrscheinlich nun nach dem update (3 Tage).

            mcm1957M Online
            mcm1957M Online
            mcm1957
            schrieb am zuletzt editiert von
            #5

            @iob69 sagte in Typescript: Problem mit getObject():

            let obj = console.log(getObject(deviceId));
            let s:string = obj.common;

            schau nochmal was da steht
            console.log retourniert doch kein object

            und obj.common ist niemals ein string

            Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
            Support Repositoryverwaltung.

            Wer Danke sagen will, kann nen Kaffee spendieren: https://paypal.me/mcm1957atiobroker

            LESEN - gute Forenbeitrage

            I 1 Antwort Letzte Antwort
            0
            • mcm1957M mcm1957

              @iob69 sagte in Typescript: Problem mit getObject():

              let obj = console.log(getObject(deviceId));
              let s:string = obj.common;

              schau nochmal was da steht
              console.log retourniert doch kein object

              und obj.common ist niemals ein string

              I Offline
              I Offline
              iob69
              schrieb am zuletzt editiert von
              #6

              @mcm1957 sagte in Typescript: Problem mit getObject():

              schau nochmal was da steht

              Ja, das ist natürlich quatsch, da hab ich beim debuggen was falsch zusammenkopiert. Ich hab's jetzt so versucht:

              let obj = getObject(deviceId); // ergibt ein objekt
              let s = obj.common; // ergibt ein objekt
              let s2 = s.name; 
              console.log(typeof(s2)); // ergibt ein string
              

              aber

              deviceName=getObject(deviceId).common.name;
              

              gibt offenbar neu diesen compiler-Fehler:

              TypeScript compilation failed:
                          deviceName = getObject(deviceId).common.name;
                          ^
              ERROR: Type 'StringOrTranslated' is not assignable to type 'string'.
                Type 'Translated' is not assignable to type 'string'.
              
              1 Antwort Letzte Antwort
              0
              • mcm1957M Online
                mcm1957M Online
                mcm1957
                schrieb am zuletzt editiert von
                #7

                Wenn deviceName vom Typ string ist, dann ist die Fehlermeldung korrekt.

                getObject liefert wie schon geschrieben den Typ StringOrTranslated, das ist konkret entweder ein String oder ein Objekt zurück. Der Typ ist eben KEIN einfacher String und kann einem String nicht zugewiesen werden. Da der Kompiler nicht weiß ob beim abgefragten State nun eine String oder ein Objekt retoruniert wird, meldet er zurecht einen Fehler wenn du versuchst es in einem String zu speichern.

                Verwende die richtigen Typen oder frage ab ob ein String zurückkommt oder ein Objekt. Das musst du eh tun wenn du den Namenseintrag richtig verarbeiten willst.

                Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
                Support Repositoryverwaltung.

                Wer Danke sagen will, kann nen Kaffee spendieren: https://paypal.me/mcm1957atiobroker

                LESEN - gute Forenbeitrage

                1 Antwort Letzte Antwort
                0
                • I Offline
                  I Offline
                  iob69
                  schrieb am zuletzt editiert von
                  #8

                  ok, ich hab's jetzt so gelöst. Da ich sicher weiss, dass 'name' das ein string ist und sich dieser nicht ändert, kann ich ihn gleich casten.
                  let name:string = getObject(deviceId).common.name as string;
                  Ich begreif zwar das problem, dass der Compiler nicht in die Struktur sehen kann, aber ich kapier immer noch nicht wieso das plötzlich als Problem aufgetaucht ist, wo es schon seit zwei Jahren so lief.

                  PS: kann man solche Strukturen nicht irgendwie abfragen, rsp. dem Compiler mitteilen, so dass dieser die Datenstruktur kennt?
                  Dazu müsste man aber die Konkrete Klasse kennen, die so ein Objekt (in diesem Fall ein Datenpunkt, der aber je nachdem wie er erzeugt wird ja andere Typen hat) darstellt.

                  1 Antwort Letzte Antwort
                  0
                  • T Nicht stören
                    T Nicht stören
                    ticaki
                    schrieb am zuletzt editiert von ticaki
                    #9

                    Ich hab das doch oben erklärt - types sind da um dir zu helfen und wenn das mit

                    common: {
                      name: any;
                      //...
                    }
                    

                    definiert ist wäre eine Verbesserung das als:

                    common: {
                      name: StringOrTranslated;
                      //...
                    }
                    

                    zu definieren.

                    Anstatt es zu casten kannste es auch richtig machen:

                    const cname = getObject(deviceId).common.name;
                    let name: string = typeof cname === 'string' ? cname : cname?.de ? cname.de : cname.en
                    

                    weiß nicht genau was der scriptadapter da zurück liefert, daher wäre für mich die richtig lösung

                    const obj = getObject(deviceId)
                    const cname = obj?.common?.name
                    let name: string = typeof cname === 'string' ? cname : cname?.de ? cname.de : (cname?.en ?? '')
                    

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    1 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    740

                    Online

                    32.6k

                    Benutzer

                    82.1k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe