NEWS
[Work in Progress] TypeScript-Support für JS-Adapter
-
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 paar Änderungen später:
Known bugs:
- Compiler beschwert sich über nicht definierte ioBroker-Funktionen. Ich arbeite an der Definition.
-
Hallo,
darüber bin ich auch gerade gestolpert:
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ß
-
Gibt es hier einen Workaround? `
Sollte inzwischen funktionieren:
Ist dein JS-Adapter aktuell? Wenn ja, probier mal die Version von Github. => Adapterliste => Github-Symbol => Aus Dropdown "javascript" auswählen. -
Hab ich gemacht, trotzdem noch das Problem.
Version des adapters ist: 3.6.0
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]
-
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
-
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.
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. -
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.
-
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.
-
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();
-
Super, Danke !
Das mit dem deklarieren ist kein Problem. Sollte mit in die Doku.
-
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