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. [gelöst] Typkonvertierung in Typescript

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.5k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.7k

[gelöst] Typkonvertierung in Typescript

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 3 Kommentatoren 342 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 Online
    I Online
    iob69
    schrieb am zuletzt editiert von iob69
    #1

    Hallo,
    als Programmierer in anderen typisierten Sprachen bevorzuge ich typescript weil es einfach weniger Fehleranfällig ist.
    Dazu folgende Fragen an (Typescript)-Spezialisten:
    Ich hab mehrere Datenpunkte auf die ich triggern will. In der Funktion will ich nun herausfinden, welcher Datenpunkt getriggert wurde, und was dieser z.B. vorher für einen State hatte.
    Achtung! Dies ist ein fiktives Beispiel um zu verstehen, wie das mit den Objekten respektive Klassen funktioniert.
    Ich könnte natürlich auf jeden Datenpunkt einzeln triggern, aber es geht darum zu verstehen, ob ich auf Daten des Objektes das ich da bekomme - wenn ich weiss was es für eine Struktur hat - zugreifen kann.
    Das Beispiel:

    const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
    
    on(MyDPs, async (data) => {
        console.log(data);
    });
    

    liefert mir folgenden output:

    script.js.Eigene_Scripte.Test.DPTest: EventObj { id: '0_userdata.0.testNumber', 
      newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, 
      oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, 
      state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }
     }
    

    Ich sehe also die Struktur. Nur kann ich in typescript nicht einfach auf data.oldstate.val zugreifen, da für typescript der Datentyp nicht klar ist. Ich hab also versucht das Objekt nachzubilden:

    type EventObj = { id: '0_userdata.0.testNumber', 
                     newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, 
                     oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, 
                     state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' } 
    }
    
    //console.log(getState('0_userdata.0.testNumber'));
    const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
    
    on(MyDPs, async (data) => {
        console.log(data);
        console.log((data as EventObj).newState.val);
    });
    

    Was mir folgenden Compilerfehler gibt:

    script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as EventObj).newState.val); ^ ERROR: Conversion of type 'ChangedStateObject<any, any>' to type 'EventObj' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Types of property 'newState' are incompatible. Property 'user' is missing in type 'State<any>' but required in type '{ val: number; ts: number; ack: false; lc: number; from: string; q: number; c: undefined; user: string; }'. 
    

    Offenbar kennt er die Klasse ChangedStateObject<any, any>
    Also hab ich auf diesen Typen gecastet:

    console.log((data as ChangedStateObject<any, any>).newState.val);
    

    Und jetzt kennt er ihn plötzlich nicht mehr?

    script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as ChangedStateObject<any, any>).newState.val); ^ ERROR: Cannot find name 'ChangedStateObject'. 
    

    Hab's auch mit Klassen versucht:

    class State {
        val: number; 
        ts: number; 
        ack: false; 
        lc: number; 
        from: string; 
        q: number; 
        c: undefined; 
        user: string;
    }
    
    class EventObj { 
        id: string;
        newState: State; 
        oldState: State; 
        state: State; 
    }
    
    //console.log(getState('0_userdata.0.testNumber'));
    const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
    
    on(MyDPs, async (data) => {
        console.log(data);
        console.log((data as EventObj).newState.val);
    });
    

    gleiche Fehlermeldungen, obwohl "user" in "State" existiert.

    Wie kann ich auf die einzelnen Inhalte von "data" zugreifen?

    T 1 Antwort Letzte Antwort
    0
    • T Offline
      T Offline
      TT-Tom
      schrieb am zuletzt editiert von
      #2

      @iob69 sagte in Typkonvertierung in Typescript:

       on(MyDPs, async (data) => {
           console.log(data.id);
           console.log(data.state.val);
           console.log(data.oldstate.val);
       });
      

      das sollte funktionieren.

      Gruß Tom
      https://github.com/tt-tom17
      Wenn meine Hilfe erfolgreich war, benutze bitte das Voting unten rechts im Beitrag

      NSPanel Script Wiki
      https://github.com/joBr99/nspanel-lovelace-ui/wiki

      NSPanel Adapter Wiki
      https://github.com/ticaki/ioBroker.nspanel-lovelace-ui/wiki

      I 1 Antwort Letzte Antwort
      1
      • I iob69

        Hallo,
        als Programmierer in anderen typisierten Sprachen bevorzuge ich typescript weil es einfach weniger Fehleranfällig ist.
        Dazu folgende Fragen an (Typescript)-Spezialisten:
        Ich hab mehrere Datenpunkte auf die ich triggern will. In der Funktion will ich nun herausfinden, welcher Datenpunkt getriggert wurde, und was dieser z.B. vorher für einen State hatte.
        Achtung! Dies ist ein fiktives Beispiel um zu verstehen, wie das mit den Objekten respektive Klassen funktioniert.
        Ich könnte natürlich auf jeden Datenpunkt einzeln triggern, aber es geht darum zu verstehen, ob ich auf Daten des Objektes das ich da bekomme - wenn ich weiss was es für eine Struktur hat - zugreifen kann.
        Das Beispiel:

        const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
        
        on(MyDPs, async (data) => {
            console.log(data);
        });
        

        liefert mir folgenden output:

        script.js.Eigene_Scripte.Test.DPTest: EventObj { id: '0_userdata.0.testNumber', 
          newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, 
          oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, 
          state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }
         }
        

        Ich sehe also die Struktur. Nur kann ich in typescript nicht einfach auf data.oldstate.val zugreifen, da für typescript der Datentyp nicht klar ist. Ich hab also versucht das Objekt nachzubilden:

        type EventObj = { id: '0_userdata.0.testNumber', 
                         newState: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' }, 
                         oldState: { val: 6, ts: 1732119361007, ack: false, lc: 1732119361007, from: 'system.adapter.javascript.0', q: 0, c: 'script.js.Eigene_Scripte.Run.Watchdogs.AdapterWD', user: 'system.user.admin' }, 
                         state: { val: 5, ts: 1733387240318, ack: false, lc: 1733387240318, from: 'system.adapter.admin.0', q: 0, c: undefined, user: 'system.user.admin' } 
        }
        
        //console.log(getState('0_userdata.0.testNumber'));
        const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
        
        on(MyDPs, async (data) => {
            console.log(data);
            console.log((data as EventObj).newState.val);
        });
        

        Was mir folgenden Compilerfehler gibt:

        script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as EventObj).newState.val); ^ ERROR: Conversion of type 'ChangedStateObject<any, any>' to type 'EventObj' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Types of property 'newState' are incompatible. Property 'user' is missing in type 'State<any>' but required in type '{ val: number; ts: number; ack: false; lc: number; from: string; q: number; c: undefined; user: string; }'. 
        

        Offenbar kennt er die Klasse ChangedStateObject<any, any>
        Also hab ich auf diesen Typen gecastet:

        console.log((data as ChangedStateObject<any, any>).newState.val);
        

        Und jetzt kennt er ihn plötzlich nicht mehr?

        script.js.Eigene_Scripte.Test.DPTest: TypeScript compilation failed: console.log((data as ChangedStateObject<any, any>).newState.val); ^ ERROR: Cannot find name 'ChangedStateObject'. 
        

        Hab's auch mit Klassen versucht:

        class State {
            val: number; 
            ts: number; 
            ack: false; 
            lc: number; 
            from: string; 
            q: number; 
            c: undefined; 
            user: string;
        }
        
        class EventObj { 
            id: string;
            newState: State; 
            oldState: State; 
            state: State; 
        }
        
        //console.log(getState('0_userdata.0.testNumber'));
        const MyDPs = ['0_userdata.0.TestBool2', '0_userdata.0.testNumber'];
        
        on(MyDPs, async (data) => {
            console.log(data);
            console.log((data as EventObj).newState.val);
        });
        

        gleiche Fehlermeldungen, obwohl "user" in "State" existiert.

        Wie kann ich auf die einzelnen Inhalte von "data" zugreifen?

        T Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von ticaki
        #3

        @iob69

        data hat den Typ iobJS.ChangedStateObject newState ist veraltet. state ist richtig

        https://github.com/ioBroker/ioBroker.javascript/blob/840d03855636c4271971afc202532d008c22d264/lib/javascript.d.ts#L860

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        I 1 Antwort Letzte Antwort
        2
        • T TT-Tom

          @iob69 sagte in Typkonvertierung in Typescript:

           on(MyDPs, async (data) => {
               console.log(data.id);
               console.log(data.state.val);
               console.log(data.oldstate.val);
           });
          

          das sollte funktionieren.

          I Online
          I Online
          iob69
          schrieb am zuletzt editiert von
          #4

          @tt-tom
          Stimmt. Ich weiss nicht, was ich da gemacht hab, damit es nicht funktioniert hat. Hab dann vergebens nach anderen Lösungen gesucht. :face_with_rolling_eyes:
          Es funktioniert sogar die intellisense!

          1 Antwort Letzte Antwort
          0
          • T ticaki

            @iob69

            data hat den Typ iobJS.ChangedStateObject newState ist veraltet. state ist richtig

            https://github.com/ioBroker/ioBroker.javascript/blob/840d03855636c4271971afc202532d008c22d264/lib/javascript.d.ts#L860

            I Online
            I Online
            iob69
            schrieb am zuletzt editiert von
            #5

            @ticaki
            Ah, ok, da ist also offenbar eine iobJS-Library dahinter. Gibt es dazu eine Dok?

            T 1 Antwort Letzte Antwort
            0
            • I iob69

              @ticaki
              Ah, ok, da ist also offenbar eine iobJS-Library dahinter. Gibt es dazu eine Dok?

              T Nicht stören
              T Nicht stören
              ticaki
              schrieb am zuletzt editiert von
              #6

              @iob69
              https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#best-practice

              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

              Spenden

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


              Support us

              ioBroker
              Community Adapters
              Donate

              830

              Online

              32.4k

              Benutzer

              81.5k

              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