Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Typprüfung mit javascript.d.ts

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Typprüfung mit javascript.d.ts

    This topic has been deleted. Only users with topic management privileges can see it.
    • ruhr70
      ruhr70 last edited by

      Bei dem Thema Typprüfung lass ich nicht locker :mrgreen:

      Das Thema bringt mich einen Riesenschritt weiter, läuft aber an vielen Stellen noch nicht rund.

      Das nächste "Problem".

      Die Infos für die eigenen globalen Funktionen erscheinen erst, wenn der erste Parameter begonnen wurde zu tippen.

      Bei den Funktionen aus dem Javascript-Adapter kommt die Hilfe direkt nach der Klammer.

      Wie es jetzt bei mir ist, ist es nur bedingt hilfreich, siehe:

      327_typecheck_4.png

      1 Reply Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer last edited by

        Hmm dazu müsste ich deine global-ts-Datei mal sehen. Eigentlich müsste das gleich funktionieren. Bei mir gehts:
        1097_unbenannt.png
        Auf jeden Fall kannst du per STRG+Leertaste das Fenster auch manuell öffnen.

        1 Reply Last reply Reply Quote 0
        • ruhr70
          ruhr70 last edited by

          @AlCalzone:

          Hmm dazu müsste ich deine global-ts-Datei mal sehen. Eigentlich müsste das gleich funktionieren. Bei mir gehts:

          Auf jeden Fall kannst du per STRG+Leertaste das Fenster auch manuell öffnen. `

          Die global-ts:

          ! ````
          import child_process = require("child_process");
          ! // tslint:disable:no-namespace
          declare global {

          namespace iobGlobal {
          

          ! type loglevel = "debug2" | "debug1" | "debug" | "info" | "warn" | "error";

          }
          

          ! // Logikwerte:
          // ===========================================
          /**
          * true/false als Ergebnis ob der aktuelle Tag ein Arbeitstag ist
          /
          function arbeitstag(): boolean;
          ! /
          *
          * true/false als Ergebnis ob der aktuelle Tag ein Urlaubstag ist
          /
          function urlaubstag(): boolean;
          ! /
          *
          * true wenn die aktuelle Zeit im angegebenen Zeitraum liegt
          * @param strLower Startzeit formatiert als hh:mm:ss
          * @param strUpper Endzzeit formatiert als hh:mm:ss
          /
          function isTimeInRange(strLower:string, strUpper:string): boolean;
          ! // Werte ausgeben
          // ===========================================
          /
          *
          * gibt den Wochentag (Montag, Dienstag, ...) als Text zurück
          /
          function wochentag(): string;
          ! /
          *
          * Gibt das Delta zwischen einem im Datenpunkt gespeicherten
          * Epoch Wert und der aktuellen Zeit formatiert zurück.
          * Der Datenpunkt wird danach aktualisiert.
          * Zum speichern einer Zeit in einen Datenpunkt kann die Funktion
          * dateEpochNow() verwendet werden.
          * @param datenpunkt ID, in der die letzt Änderung im Epoche steht.
          /
          function deltazeit(datenpunkt:string): string;
          ! /
          *
          * gibt das aktuelle Datum & die Zeit formatiert aus
          * Defaultformat: "YYYY-MM-DD hh:mm:ss"
          * @param format Format der Ausgabe, Format wie bei formateDate()
          * @param msBool true: ms im Format .ms werden angehängt
          /
          function dateNow(format?:string,msBool?:boolean): string;
          ! /
          *
          * Gibt die Anzahl der gefundenen Subscriptions zurück.
          * Listet alle Subscriptions innerhalb der Javascript-Instanz auf, die dem Filter entsprechen, im Log auf.
          * Defaultformat: "YYYY-MM-DD hh:mm:ss"
          * @param scriptname (optional) "alle", "Name des Skripts", "FEQ", usw.
          * @param level (optional) loglevel für logs, default: "info"
          * // Filter (scriptname):
          * --------------------
          * sucht den String in den überwachten Datenpunkten der Javascript-Instanz
          * und sucht den String in den Scriptnamen innerhalb der Javascript-Instanz
          * keine Angabe -> Filter = "alle" (alle Subscriptions der Instanz)
          *
          * loglevel
          * --------
          * loglevel = "debug2" | "debug1" | "debug" | "info" | "warn" | "error"
          *
          * Beispiele:
          * ----------
          * prinSubs(); listet alle Subscriptions innerhalb der Javascript-Instanz auf
          * prinSubs("alle"); listet alle Subscriptions innerhalb der Javascript-Instanz auf
          * printSubs("Skriptname"); alle Subscriptions innerhalb des aufrufenden Scripts
          * printSubs("FEQ"); alle Subscriptions, die im Script oder Objekt "FEQ" enthalten
          /
          function printSubs(scriptname?:string,level?:iobGlobal.loglevel): number;
          ! /
          *
          * Gibt eine zufällige Zahl zwischen min und max zurück
          * @param min kleinster möglicher Wert der Zufahlszahl
          * @param max größter möglicher Wert der Zufahlszahl
          /
          function rand(min:number,max:number) : number;
          ! // Funktionen
          // ===========================================
          ! /
          *
          * Rundet eine Zahl auf die angegebenen Stellen
          * @param wert Zahl, die gerundet werden soll
          * @param stellen Anzahl der Stellen
          /
          function runden(wert: number, stellen: number): number;
          ! /
          *
          * Ansage über den sayit Adapter
          * @param text Ansage, die abgespielt werden soll
          * @param vol (optional) Lautstärke der Ansage von 1-100
          * @param instanz? (optional) ohne Angabe: default Instanz. Mit Angabe: sayit Instanz
          */
          function sayit(text: string, vol?: number, instanz?: number): void;

          /**
           * formatiert eine Übergabe in Sekunden zu einem lesbaren String
           * @param  sekunden Sekunden, die lesbar ausgegeben werden sollen
           */
          function sek2txt(sekunden:number | string): string;
          

          ! /**
          * Loglevel innerhalb eines Javascripts
          * das Script muss am die Variable des gewünschten Loglevels definiert haben, z.B.:
          * var loglevel = "info";
          * @param logtext Text, der in der Logausgabe erscheinen soll
          * @param level "debug2" | "debug1" | "debug" | "info" | "warn" | "error"
          * @param color? (optional) ohne Angabe: vordefinierte Farbe für den level, mit Angabe: gültige html Farbe
          * Rückgabe: verwendeter Loglevel zur Information
          /
          function logs(logtext:string,level:iobGlobal.loglevel,color?:string):string;
          ! /
          *
          * Schreibt einen Text mit Zeitstempel in eine Logdatei
          * Datei: /opt/iobroker/iobroker-data/scripts-logf.log
          * @param text Text, der mit einem Zeitstempel in die Logdatei geschrieben werden soll
          /
          function logf(text:string);
          ! /
          *
          * Fügt einen Eintrag (Text) einer Ereignisliste hinzu
          * @param text Eintrag, der der Liste hinzugefügt werden soll. Formatierungen mit html Tags möglich
          * @param list (optional) Liste, in der der Eintrag erscheinen soll. Ohne Angabe: Liste "default"
          * @param color (optional) wenn die ganze Zeile mit einer html Farbe eingefärbt werden soll
          /
          function event(text: string, list?: string, color?: string) : void;
          ! // Helfer:
          // ===========================================
          /
          *
          * liefere Anzahl n nbsp in utf-8, wenn str nicht angegeben oder n-mal str
          * @param n Anzahl von nbsp;, bzw. wenn str angegeben: ANzahl des Strings in str
          * @param str (optional) String, welche n mal erzeugt wird
          /
          function fill(n:number,str?:string): string;
          ! /
          *
          * gibt das aktuelle Datum in Epoch zurück
          /
          function dateEpochNow() : number;
          ! /
          *
          * entfernt aus einem html String die html Tags
          */
          function html2str(html:string) : number;
          ! // Workaround, Fehler in der ioBroker Typprüfung
          // ===========================================
          function getSubscriptions(): any;
          ! const name: string;
          ! }
          ! ````

          STRG+Leertaste probiere ich direkt

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            So etwas getestet.

            Neuer Ordner, zwei Testdateien angelegt (test.js und test.d.ts).

            Es verhält sich schon anders als bei Dir, aber besser als in meiner Arbeitsumgebung.

            Die Funktion wird während des tippens nicht vorgeschlagen.

            Erst, wenn ich "Klammer auf" drücke erscheint die Beschreibung.

            327_typecheck_5.png

            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              Die gleichen Dateien in einem Arbeitsordner in meinem Skript Arbeitsverzeichnis:

              327_typecheck_6.png

              Wenn ich nun die "Klammer auf drücke, wird abc gegen AbortController( ersetzt.

              Wenn ich das nicht will, muss ich direkt nach abc die [ESC] Taste drücken.

              Du hast require("fs"); in der *.d.ts Datei gesetzt. Reicht das aus Deiner Sicht dort?

              Ich hätte das jetzt bei jedem Skript davor gesetzt.

              1 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                In meinem Arbeitsbereich verhält sich vscode total schizophren :shock:

                327_typecheck_7.png

                tippe ich abc ein kommen andere Vorschläge.

                Ich muss ESC drücken, damit mit der Klammer auf das abc nicht durch einen Vorschlag ersetzt wird.

                In diesem Moment erscheint der Hilfetext zur Funktion abc().

                Gleichzeitig wird abc unterstrichen und angemeckert, dass die Funktion unbekannt ist.

                Verlasse ich einmal die Klammern () verschwindet der Hilfetext und tauch auch nicht mehr auf.

                1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  Schau dir mal meinen Screenshot bzw. javascript.d.ts genau an. Auch diese Datei muss in ein Modul "gezwungen" werden. Anders als bei JS reicht require nicht aus, es muss das import keyword fallen.

                  // entweder so
                  import * as fs from "fs";
                  // oder so
                  import fs = require("fs");
                  
                  1 Reply Last reply Reply Quote 0
                  • R
                    robsdobs last edited by

                    Hallo,

                    ich hab auch noch mal eine Frage…

                    Wenn ich am Anfang der Datei die Referenz auf die Definitionsdatei setze

                    /// 
                    

                    klappt das im VS Code super, aber im IOBroker Admin bekomme ich beim Compilieren dann natürlich einen Fehler:

                    12:40:00.730	[error]	javascript.0 script.js.common.xTest_ts: TypeScript compilation failed: /// ^ ERROR: File '/opt/iobroker/node_modules/iobroker.javascript/common/javascript.d.ts' not found. 
                    

                    Daher muss ich das vorher immer bearbeiten (mache aus den /// ein ////) oder habe Pech - wenn ich das vergesse. Da ich mit dem "js2fs" plugin arbeite muss ich das immer vor jedem Speichern im VS Code machen - wo das vergessen schon mal häufiger passiert.

                    Gibt es hier einen besseren Weg?

                    Danke & Gruß

                    Robert

                    1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer last edited by

                      Du arbeitest scheinbar mit TypeScripts.

                      Der TypeScript-Modus lädt die Datei automatisch für dich, da sie bereits in den JavaScript-Adapter integriert ist und TypeScript zwangsläufig diese Definitionen benötigt.

                      Du musst VSCode nur beibringen, dass es sich bei deiner Ordnerstruktur um ein Projekt handelt. Das geht mit einer leeren tsconfig.json im Hauptordner, danach werden .d.ts-Dateien automatisch eingebunden:
                      1097_unbenannt.png
                      Besser ist natürlich eine passende tsconfig.json, z.B. für NodeJS 4+

                      {
                      	"compilerOptions": {
                      		"target": "es5",
                      		"lib": [
                      			"es6",
                      		]
                      	},
                      }
                      
                      1 Reply Last reply Reply Quote 0
                      • R
                        robsdobs last edited by

                        Danke, werde ich heute Abend ausprobieren.

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          @AlCalzone:

                          Schau dir mal meinen Screenshot bzw. javascript.d.ts genau an. Auch diese Datei muss in ein Modul "gezwungen" werden. Anders als bei JS reicht require nicht aus, es muss das import keyword fallen.

                          // entweder so
                          import * as fs from "fs";
                          // oder so
                          import fs = require("fs");
                          ```` `  
                          

                          Verrückt. kaum macht man es richtig, funktioniert es. Nun ja, fast 😉

                          Beim Testordner mit der Funktion abc() funktioniert es nun einwandfrei.

                          Nur mein eigentlicher Arbeitsbereich macht die Selben Probleme, wie oben beschrieben.

                          Dort werden die Funktionen zwar erkannt, die Parameter aber weiterhin mit any angezeigt und ohne Beschreibung.

                          Zur Eingrenzung habe ich dann meine globale Typedatei in den Testordner mit der abc() Funktion kopiert.

                          Hier funktionieren die Funktionen aus der globalen Datei auch einwandfrei.

                          Zur weiteren Eingrenzung habe ich dann auch die jsonconfig.json in den Testordner kopiert, um sicherzustellen, dass die Probleme nicht durch diese Datei kommen. Auch hier funktioniert es einwandfrei.

                          Problem gefunden

                          argh… während ich das hier tippe habe ich dann noch den Ordner global mit den globalen Skripten in den Testordner reinkopiert.

                          In diesem Moment funktioniert es nicht mehr sauber. :oops:

                          Die globalen Funktionen haben noch nicht das require("fs"); am Anfang des Skripts.

                          Werde dann jetzt erst einmal alle Skripte mit dem require("fs");versehen... sind ein paar... 🙂

                          Danke für Deine Mühe!!!

                          1 Reply Last reply Reply Quote 0
                          • R
                            robsdobs last edited by

                            Danke, bei mir funktioniert es prinzipiell.

                            Jetzt habe ich jedoch ein anderes Problem festgestellt:
                            1367_2018-04-03_21h34_40.png

                            Das fehlt in der javascript.d.ts tatsächlich.

                            In der Doku steht: "Same as javascript setTimeout."

                            1 Reply Last reply Reply Quote 0
                            • AlCalzone
                              AlCalzone Developer last edited by

                              @robsdobs:

                              Das fehlt in der javascript.d.ts tatsächlich.

                              In der Doku steht: "Same as javascript setTimeout." `
                              Korrekt, das kommt auch nicht in die javascript.d.ts, da es sich um Grundfunktionalität handelt. Dein Problem scheint aufzutreten, wenn im Ordner eine tsconfig.json existiert. Warum auch immer.

                              Beheben kannst du es, indem du die NodeJS-Typings im Arbeitsbereich installierst.

                              npm i @types/node
                              
                              

                              für die neueste Version, bzw.

                              npm i @types/node@4
                              

                              für NodeJS 4.

                              1 Reply Last reply Reply Quote 0
                              • AlCalzone
                                AlCalzone Developer last edited by

                                Wen es interessiert, ich habe den VSCode-Editor ("Monaco") in den Skriptadapter eingebaut.

                                Das ganze benötigt noch ein wenig Arbeit, da insbesondere der Wechsel von Blockly zu JS nicht funktioniert. Aber wer das nicht benötigt, darf gerne schon mal testen:

                                Installation aus eigener URL: https://github.com/AlCalzone/ioBroker.j … ter-editor

                                --

                                1097_unbenannt.png

                                –

                                1097_unbenannt2.png

                                –

                                1097_bild1.png

                                1 Reply Last reply Reply Quote 0
                                • R
                                  robsdobs last edited by

                                  Super Sache!

                                  Ich vermute mal das ist unabhängig vom Editor. Mit der Version 3.7.0 des Javascript Adapters funktionieren jetzt leider meine Scripte alle nicht. Es kommt beim Starten überall der Fehler "ReferenceError: exports is not defined":

                                  javascript.0	2018-05-18 20:19:02.802	error	at ContextifyScript.Script.runInContext (vm.js:35:29)
                                  javascript.0	2018-05-18 20:19:02.802	error	at script.js.common.Status.Stauberechnung_ts:2:23
                                  javascript.0	2018-05-18 20:19:02.802	error	ReferenceError: exports is not defined
                                  javascript.0	2018-05-18 20:19:02.802	error	^
                                  javascript.0	2018-05-18 20:19:02.802	error	Object.defineProperty(exports, "__esModule", { value: true });
                                  javascript.0	2018-05-18 20:19:02.800	error	script.js.common.Status.Stauberechnung_ts: script.js.common.Status.Stauberechnung_ts:2
                                  javascript.0	2018-05-18 20:19:02.796	info	script.js.common.Status.Stauberechnung_ts: TypeScript compilation successful
                                  javascript.0	2018-05-18 20:19:02.686	info	script.js.common.Status.Stauberechnung_ts: compiling TypeScript source...
                                  javascript.0	2018-05-18 20:19:02.686	error	at ContextifyScript.Script.runInContext (vm.js:35:29)
                                  javascript.0	2018-05-18 20:19:02.685	error	at script.js.common.Status.TüreFenster_ts:2:23
                                  javascript.0	2018-05-18 20:19:02.685	error	ReferenceError: exports is not defined
                                  javascript.0	2018-05-18 20:19:02.685	error	^
                                  javascript.0	2018-05-18 20:19:02.685	error	Object.defineProperty(exports, "__esModule", { value: true });
                                  javascript.0	2018-05-18 20:19:02.685	error	script.js.common.Status.TüreFenster_ts: script.js.common.Status.TüreFenster_ts:2
                                  javascript.0	2018-05-18 20:19:02.680	info	script.js.common.Status.TüreFenster_ts: TypeScript compilation successful
                                  javascript.0	2018-05-18 20:19:02.501	info	script.js.common.Status.TüreFenster_ts: compiling TypeScript source...
                                  javascript.0	2018-05-18 20:19:02.501	error	at ContextifyScript.Script.runInContext (vm.js:35:29)
                                  javascript.0	2018-05-18 20:19:02.501	error	at script.js.common.System.AlarmControl_ts:2:23
                                  javascript.0	2018-05-18 20:19:02.501	error	ReferenceError: exports is not defined
                                  javascript.0	2018-05-18 20:19:02.501	error	^
                                  javascript.0	2018-05-18 20:19:02.500	error	Object.defineProperty(exports, "__esModule", { value: true });
                                  javascript.0	2018-05-18 20:19:02.489	error	script.js.common.System.AlarmControl_ts: script.js.common.System.AlarmControl_ts:2
                                  javascript.0	2018-05-18 20:19:02.486	info	script.js.common.System.AlarmControl_ts: TypeScript compilation successful
                                  javascript.0	2018-05-18 20:19:02.420	info	script.js.common.System.AlarmControl_ts: compiling TypeScript source...
                                  

                                  Hab mal ein Issue auf https://github.com/ioBroker/ioBroker.javascript/issues/118 eröffnet.

                                  Hypnos3 created this issue in ioBroker/ioBroker.javascript

                                  closed Typescript-Script ReferenceError with 3.7.0 #118

                                  1 Reply Last reply Reply Quote 0
                                  • AlCalzone
                                    AlCalzone Developer last edited by

                                    Fixed in https://github.com/ioBroker/ioBroker.ja … t/pull/119

                                    1 Reply Last reply Reply Quote 0
                                    • R
                                      robsdobs last edited by

                                      Danke!

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      744
                                      Online

                                      31.7k
                                      Users

                                      79.9k
                                      Topics

                                      1.3m
                                      Posts

                                      3
                                      40
                                      4357
                                      Loading More Posts
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                      The ioBroker Community 2014-2023
                                      logo