NEWS
Hilfe bei Strukturierung von Klassen in TypeScript
-
Angenommen ich habe in common 2 Dateien:
Datei 1:
class A { }
Datei 2:
class B { }
Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann. Das möchte ich aber nicht. Möchte auf gleicher Ebene Klassen referenzieren, so wie dies z.B. in Java möglich ist.
Datei 3:
var myArray = []; myArray.push(new A()); myArray.push(new B());
Kann mir hier bitte jemand helfen?
-
@uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:
Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann.
Geht nicht direkt im Skript-Editor wenn du global vermeiden willst. Packe alles in ein einzelnes Skript oder lagere die gemeinsamen Dinge wie die Klassen in externe Module (Dateien) aus, die du auf der Platte in einem Ordner ablegst, der für den Nutzer
iobroker
lesbar ist. Die kannst du dann perrequire("/pfad/zur/datei.js")
laden. -
@alcalzone Perfekt, danke erst einmal. Werde ich heute Abend ausprobieren!
-
@alcalzone Darf ich nachfragen, ob Du eine Idee hast was ich falsch mache?
Eine Test-Klasse habe ich den Datei test.ts abgelegt:
Fehlermeldung kommt dann, dass Datei nicht gefunden werden kann:
-
@uwe72 absolute Pfade funktionieren nicht, mache es so:
../my-scripts/test.ts
-
@fastfoot sieht besser aus:
Aber irgendwie kann nichts geladen werden?
-
@uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:
Aber irgendwie kann nichts geladen werden?
heißt deine Function nicht getResult()?
-
Ja, meine Funktion heißt schon so. Meiner Meinung nach komme ich leider gar nicht so weit diese Funktion/Methode aufzurufen.
require liefert irgendwie nichts zurück. Das File (test.ts) wird aber nun grundsätzlich gefunden.
Als ehemaliger Java-Entwickler
würde ich so was in der Art schreiben:
Kommen aber viele Fehler:
-
@uwe72 wenn du ein js importierst dann klappt es, allerdings fehlen ja dann die Vorteile von Typescript. Ich denke das importierte ts Modul wird als js behandelt, was dann natürlich fehlschlägt. Es wird aber schon Zeile 2 des imports moniert, ohne weitere Hinweise
Sind aber Mutmaßungen, kenne TS nicht wirklich. Mit importierter js ist aber getestet
-
@fastfoot Danke dir für deine Unterstützung. Denke dafür ist iobroker nicht ausgelegt. Es geht ja definitiv auch ohne! Werde alles in einer TypeScript-Datei lassen und gut ist es.
Komme halt aus der Java-Welt und da sehne ich mich nach ein wenig nach mehr Struktur
Danke nochmals und Grüße!
Uwe -
@uwe72 Schnupper halt rein, und wenn dir die Möglichkeiten nicht ausreichen dann kannst Du dich ja an einen Adapter wagen, da geht dann alles
Die Scriptumgebung ist schon sehr cool, aber Anwendungen wie Deine finden sich hier tatsächlich sehr, sehr wenige. Ist wohl mit ein Grund warum das nicht zu 100% klappt mit den Imports. Mir persönlich reicht da auch pure JS, mich hat bei den require tests schon die compilation time für TS genervt
Und bei den imports muss die Instanz neu gestartet werden damit Änderungen erkannt werden, auch das ist lästig weshalb ich es auch mit JS gar nicht nutze. Das ist aber kein Manko des iobroker, finde ich, schließlich ist das ein iot System.
-
@fastfoot richtig, kein Manko des iobrokers. Iobroker ist richtig klasse!
-
ich häng mich mal dran:
Bei mir findet er nicht mal das Modul, obwohl ich keinen relativen Pfad nutze, er sucht auch wieder im node_modules Ordner...
Datei liegt unter : /opt/test/class.jsconst test = require ('../test/class.js')
error javascript.2 (24913) script.js.common.test.importTest: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../../test/class.js'
-
@xenon bei mir war dies auch lange so, trotz relativem Pfad. Mir ist bis heute nicht klar, warum dann die Fehlermeldung auf einmal weg war. Ggf. musst Du den Adapter neu starten? Ich weiß es nicht.
Mir ist bei dir auch nicht klar: Du hast ein TypeScript oder ein JS? Da Dateiname (class) auf TS hinweist und die Endung der Datei auf JS. Wie sieht der Inhalt von class.js aus?
-
@uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:
Da Dateiname (class) auf TS hinweist
Wieso weist das auf TS hin?
class
ist seit ES6 ein JS-Feature.Ich blicke nicht ganz ob ihr das Problem schon gelöst habt, aber hast du schon die
import
-Syntax versucht?import { Test } from "../pfad/zum/skript"; const myInstance = new Test(3, 5); //...
Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in
/opt/iobroker/node_modules/iobroker.javascript/lib
liegt. Deshalb zeigt @Xenon's Import auch auf/opt/iobroker/test/class.js
und nicht dahin wo die Datei wirklich liegt. -
@alcalzone sagte in Hilfe bei Strukturierung von Klassen in TypeScript:
Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in
/opt/iobroker/node_modules/iobroker.javascript/lib
liegt. Deshalb zeigt @Xenon's Import auch auf/opt/iobroker/test/class.js
und nicht dahin wo die Datei wirklich liegt.Das bedeutet nun genau? Wenn die Datei unter opt/iobroker/test/class.js liegt, was muss ich dann im import angeben, damit er nicht in den node_modules sucht?
-
@xenon Von
/opt/iobroker/node_modules/iobroker.javascript/lib
ausgehend ist/opt/test/class.js
unter dem relativen Pfad../../../../test/class.js
zu finden.Hier als Beispiel mal mit
/home/iobroker/test.js
:
-
@alcalzone said in Hilfe bei Strukturierung von Klassen in TypeScript:
/opt/iobroker/node_modules/iobroker.javascript/lib
Ich bin zu doof dafür
Update: Habe nun das Mirror-Verzeichnis rausgenommen (weiß nicht ob es wirklich damit zusammen hängt), funktioniert nun aber:
-
@uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:
Update: Habe nun das Mirror-Verzeichnis rausgenommen (weiß nicht ob es wirklich damit zusammen hängt), funktioniert nun aber:
upps, das ist mir gar nicht aufgefallen dass da ein Unterschied ist. Aber an der Fehlermeldung kannst du es auch sehen, da stehen 5 x
../
, also brauchst du im require nur 1x../
so wie ich es schon mal gepostet hatte. Mir war es aber früher mal nicht gelungen unterhalb von /opt/iobroker zu kommen, das werde ich mal noch ohne mirror probieren -
Ich bin mir nicht sicher, was Mirror damit zu tun haben soll. Alle Skripte laufen in einer Sandbox, die sich in
/opt/iobroker/node_modules/iobroker.javascript/lib
befindet. Von dort aus werden allerequire
s aufgelöst.Aber an der Fehlermeldung kannst du es auch sehen, da stehen 5 x ../, also brauchst du im require nur 1x ../ so wie ich es schon mal gepostet hatte
Die Fehlermeldung ist irreführend. Der JS-Adapter versucht erst den gegebenen Pfad und wenn das schief läuft hängt er vorne noch
../../
an. Das wird dann geloggt.@uwe72 Du scheinst Docker zu verwenden. Welchen (absoluten) Pfad hat denn dein Test-Skript innerhalb Docker?