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?
-
@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.ChangedStateObject
newState ist veraltet.state
ist richtig -
@tt-tom
Stimmt. Ich weiss nicht, was ich da gemacht hab, damit es nicht funktioniert hat. Hab dann vergebens nach anderen Lösungen gesucht.
Es funktioniert sogar die intellisense! -
@ticaki
Ah, ok, da ist also offenbar eine iobJS-Library dahinter. Gibt es dazu eine Dok? -