NEWS
[gelöst] Typkonvertierung in Typescript
-
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?
-
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?
data hat den Typ
iobJS.ChangedStateObjectnewState ist veraltet.stateist richtig -
@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.
-
data hat den Typ
iobJS.ChangedStateObjectnewState ist veraltet.stateist richtig -