Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] Typkonvertierung in Typescript

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] Typkonvertierung in Typescript

Scheduled Pinned Locked Moved JavaScript
6 Posts 3 Posters 395 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    iob69
    wrote on last edited by 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 Reply Last reply
    0
    • T Offline
      T Offline
      TT-Tom
      wrote on last edited by
      #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 Reply Last reply
      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 Do not disturb
        T Do not disturb
        ticaki
        wrote on last edited by 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 Reply Last reply
        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 Offline
          I Offline
          iob69
          wrote on last edited by
          #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 Reply Last reply
          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 Offline
            I Offline
            iob69
            wrote on last edited by
            #5

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

            T 1 Reply Last reply
            0
            • I iob69

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

              T Do not disturb
              T Do not disturb
              ticaki
              wrote on last edited by
              #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 Reply Last reply
              1
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              733

              Online

              32.6k

              Users

              82.2k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Home
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe