Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [Work in Progress] TypeScript-Support für JS-Adapter

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Work in Progress] TypeScript-Support für JS-Adapter

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

      Hallo,

      darüber bin ich auch gerade gestolpert:

      @AlCalzone:

      Known bugs:

      • Compiler beschwert sich über nicht definierte ioBroker-Funktionen. Ich arbeite an der Definition. `

      Gibt es hier einen Workaround?

      Ich würde gerne auf TypeScript umsteigen. Mit ist Javascript wegen der fehlenden Typisierung ein graus 🙂

      Danke & Gruß

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

        @robsdobs:

        Gibt es hier einen Workaround? `
        Sollte inzwischen funktionieren:
        1097_typescript.png
        Ist dein JS-Adapter aktuell? Wenn ja, probier mal die Version von Github. => Adapterliste => Github-Symbol => Aus Dropdown "javascript" auswählen.

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

          Hab ich gemacht, trotzdem noch das Problem.

          Version des adapters ist: 3.6.0
          1367_adapter.png

          Vielleicht mache ich auch was Grundsätzliches Falsch.

          Also ich habe unter global ein Script, welches die Funktion logDebug definiert:

          `function isPrimitive(obj) {
              return (obj !== Object(obj));
          }
          
          function logDebug() {
          	if (arguments.length > 0) {
          		var text = [];
          		for (var i = 0; i < arguments.length; i++) {
                      if (typeof arguments[i] === 'string' || arguments[i] instanceof String) {
                          text.push(arguments[i]);
          		    } else if(arguments[i] === null) {
                          text.push('null');
          		    } else if(arguments[i] === undefined) {
                          text.push('undefined');
                      } else if (isPrimitive(arguments[i])) {
                          text.push(arguments[i]);
                      } else {
                          text.push(JSON.stringify(arguments[i]));
                      }
          		}
          		log(text.join(' '), 'debug');
          	}
          }`
          
          Will ich diese Funktion under common nutzen, geht es bei Javascript:
           ![1367_javascript.png](/assets/uploads/files/1367_javascript.png) 
          
          Bei Typescript geht es nicht:
           ![1367_typescript.png](/assets/uploads/files/1367_typescript.png) 
          
          Die Datei unter global ist eine javascript datei.
          
          Ich habe auch versucht die Datei unter global als typescript:
          `~~[code]~~function isPrimitive(obj:any):boolean {
              return (obj !== Object(obj));
          }
          
          function logDebug(...param: any[]):void {
          	if (arguments.length > 0) {
          		var text:string[] = [];
          		for (var i = 0; i < arguments.length; i++) {
                      if (typeof arguments[i] === 'string' || arguments[i] instanceof String) {
                          text.push(arguments[i]);
          		    } else if(arguments[i] === null) {
                          text.push('null');
          		    } else if(arguments[i] === undefined) {
                          text.push('undefined');
                      } else if (isPrimitive(arguments[i])) {
                          text.push(arguments[i]);
                      } else {
                          text.push(JSON.stringify(arguments[i]));
                      }
          		}
          		log(text.join(' '), 'debug');
          	}
          }` 
          Dann wird die Funktion aber auch unter javascript nicht gefunden.[/i][/i][/i][/i][/i][/i][/i][/i][/code][/i][/i][/i][/i][/i][/i][/i][/i]
          
          1 Reply Last reply Reply Quote 0
          • R
            robsdobs last edited by

            Ich habe einen Workaround gefunden.

            Wenn ich meine globalen Scripte auf Javascript lasse und im lokalen ("common") Typescript die globalen Funktionen am Anfang "definiere", funktioniert es.

            Beispiel für die Lokale TypeScript Datei:

            declare function logDebug(...param: any[]):void;
            
            logDebug('Test');
            
            

            Das hilft mir erst mal, das ich meine lokalen Scripte umstellen kann.

            Eine Möglichkeit auch die globalen scripte als TypeScript zu haben und die Funktionen dann lokal (common) zu nutzen habe ich leider nicht gefunden.

            Wenn ich in einer globalen TypeScript eine Funktion habe und auch diese lokal vorher deklariere, dann funktioniert zwar das compilieren:

            22:11:32.679 [info] javascript.0 script.js.common.xTextDebug-ts: TypeScript compilation successful

            Bei der Ausführung findet er dann die globale Funktion nicht

            22:11:32.679 [error] javascript.0 script.js.common.xTextDebug-ts: ReferenceError: logTSTestA is not defined

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

              Mit globalen Skripten hab ich bisher nicht gearbeitet und getestet, das kann etwas buggy sein. Danke für den Hinweis, muss ich mir mal im Detail anschauen.

              @robsdobs:

              Wenn ich in einer globalen TypeScript eine Funktion habe und auch diese lokal vorher deklariere, dann funktioniert zwar das compilieren:

              22:11:32.679 [info] javascript.0 script.js.common.xTextDebug-ts: TypeScript compilation successful

              Bei der Ausführung findet er dann die globale Funktion nicht

              22:11:32.679 [error] javascript.0 script.js.common.xTextDebug-ts: ReferenceError: logTSTestA is not defined `
              Kannst du den Code bitte mal posten, dann kann ich sichergehen, dass ich die gleiche Ausgangssituation beim Testen habe.

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

                Also, ich bin kein programmierer und habe nur rumprobiert. Vielleicht ist das was ich hier mache auch totaler Blödsinn :lol:

                mein globales Typescript file (ts-global-test) mit den verschiedenen Varianten, die ich getestet habe:

                //ganz einfach ohne Typescript
                function logTSTestA(p) {
                    log('TypeScript global "logTSTestA "' + p + '"');
                }
                
                //einfache Typescript Funktion
                function logTSTestB(p: string):void {
                    log('TypeScript global "logTSTestB "' + p + '"');
                }
                
                //irgendwie mit export
                export function logTSTestC(p: string):void {
                    log('TypeScript global "logTSTestC "' + p + '"');
                }
                
                //andere variante mit export
                export var logTSTestD = function (p: string):void {
                    log('TypeScript global "logTSTestD "' + p + '"');
                }
                
                //mit einer modul deklaration
                //https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html
                declare module "logTest" {
                
                    export function logTSTestE(p: string):void {
                        log('TypeScript global "logTSTestE "' + p + '"');
                    }
                
                }
                
                //was ganz wildes
                //Quelle https://stackoverflow.com/questions/47736473/how-to-define-global-function-in-typescript
                function _logTSTestF(p: string):void {
                    log('TypeScript global "logTSTestF_ "' + p + '"');
                }
                
                // Global declaration
                declare var logTSTestF: typeof _logTSTestF;
                
                // Global scope augmentation
                var window = window || null;
                const _global = (window || global) as any;
                _global.logTSTestF = _logTSTestF;
                
                

                Im lokales typescript file hab ich die einzelnen varianten logTSTestA bis logTSTestD durchprobiert und das auch noch in verschiedener Weise:

                logTSTestA('ausruf test 1');
                //logTSTestB('ausruf test 2');
                //logTSTestC('ausruf test 3');
                //logTSTestD('ausruf test 4');
                
                

                Auch mal mit declare, weil ich dazu was gelesen hatte:

                declare function logTSTestA(p: string) : void;
                declare function logTSTestB(p: string) : void;
                declare function logTSTestC(p: string) : void;
                declare function logTSTestD(p: string) : void;
                
                logTSTestA('ausruf test 1');
                //logTSTestB('ausruf test 2');
                //logTSTestC('ausruf test 3');
                //logTSTestD('ausruf test 4');
                
                

                Dann noch mal mit import – hier hab ich aber keinen blassen Schimmer was ich mache:

                declare function logTSTestE(p: string) : void;
                import logTest = require('logTest');
                
                logTSTestE('ausruf test 6');
                
                declare function logTSTestF(p: string) : void;
                import logTest = require('global_ts-global-test');
                
                logTSTestF('ausruf test 6');
                

                Wie gesagt hab ich keine Ahnung. Vielleicht gibt es jetzt schon eine Möglichkeit.

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

                  import/export macht hier keinen Sinn, weil globale Skripte einfach im Quelltext vor die nicht-globalen Skripte gehängt werden. Ein Modulsystem gibt es nicht.

                  Ich habe wahrscheinlich vergessen, die unkompilierten globalen TypeScripts vor die lokalen Skripte zu hängen, bevor sie kompiliert werden.

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

                    @robsdobs:

                    Vielleicht gibt es jetzt schon eine Möglichkeit. `
                    Fixes sind in https://github.com/ioBroker/ioBroker.javascript/pull/62 enthalten, der sollte demnächst gemerged sein. Da ich nicht 2x die globalen TypeScripts kompilieren will, wird es nötig sein in die lokalen Skripten die globalen Funktionen zu deklarieren, etwa so:

                    globales Skript:

                    function tsGlobal() {
                        log("global function called!");
                    }
                    

                    lokales Skript:

                    declare function tsGlobal();
                    tsGlobal();
                    
                    1 Reply Last reply Reply Quote 0
                    • R
                      robsdobs last edited by

                      Super, Danke !

                      Das mit dem deklarieren ist kein Problem. Sollte mit in die Doku.

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

                        @AlCalzone:

                        Ich bin dabei, dem JS-Adapter TypeScript beizubringen. Ist noch Work-in-Progress und ungetestet, aber wer will kann sich gerne schon mal vergnügen `

                        Ein ganz großes Dankeschön dafür an dich!!!

                        Ich werde mich dann mal damit beschäftigen wenn ich mal wieder ein Scriptchen zu schreiben/ändern habe.

                        Ich habe die fehlende Typisierung doch schon hin und wieder verflucht wenn man strenge Typisierung von .NET & Co. gewohnt ist und sich dann JS in meinen Scripten eine fehlerhafte Zuordnung "ausgedacht" hat 😉

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate
                        FAQ Cloud / IOT
                        HowTo: Node.js-Update
                        HowTo: Backup/Restore
                        Downloads
                        BLOG

                        733
                        Online

                        32.0k
                        Users

                        80.4k
                        Topics

                        1.3m
                        Posts

                        3
                        12
                        1990
                        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