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.
    • AlCalzone
      AlCalzone Developer last edited by

      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

      https://github.com/ioBroker/ioBroker.javascript/pull/43

      AlCalzone created this issue in ioBroker/ioBroker.javascript

      closed TypeScript support #43

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

        Ein paar Änderungen später:
        1097_iob-ts.png

        Known bugs:

        • Compiler beschwert sich über nicht definierte ioBroker-Funktionen. Ich arbeite an der Definition.
        1 Reply Last reply Reply Quote 0
        • 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

                            766
                            Online

                            32.0k
                            Users

                            80.3k
                            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