iobroker-javascript-vs-code-extension
iobroker-javascript-vs-code-extension copied to clipboard
Namespace wird nicht gefunden in VSCode, Script läuft aber fehlerfrei
Describe the bug
Wenn man in einem Typescript eine Variable vom Typ NodeJS.Timeout anlegt, wird folgende Fehlermeldung angezeigt:
Den Befehlt
habe ich ausgeführt. Fehler bleibt.
To Reproduce Steps to reproduce the behavior:
- Füge in einer Typescript-Datei folgende Zeile ein:
let t:NodeJS.Timeout|null = null; - Ein Fehler analog dem oben angezeigten erscheint, wenn man über das rot unterringelte NodeJS hovert.
Expected behavior
Der Namensraum NodeJS sollte bekannt sein, da ioBroker auch keinen Fehler beim Kompilieren anzeigt und das Skript fehlerfrei läuft
Version information (please complete the following information):
- Extension version: v1.6.0
- VS Code version: 1.95.2
- ioBroker admin version: 7.1.5
- ioBroker nodejs version: v18.20.4
- ioBroker javascript adapter version:0: 6.0.11
Wenn Node.js installiert ist, können die Typdefinitionen installiert werden: npm install --save @types/node. Danach sollte der Typ bekannt sein.
Hallo Niklas,
sorry, ich verstehe deinen Kommentar nicht so wirklich, Also:
- iobroker ist auf einem Raspberry Pi installiert. Dort ist natürlich Node.js installiert. Dort wird aber auch korrekt kompiliert und der NodeJS-Namespace gefunden.
- VSCode läuft auf meinem Windows-PC, dort habe ich kein Node.js installiert. Auch kein npm oder ähnliches.
Muss ich auf dem Raspberry Pi was korrigieren oder auf meinem Windows-PC, so dass die Namensräume, die auf dem iobroker erkannt werden auch zur Verfügung stehen? Ich dachte eigentlich, dass "Update JS type definition from GitHub" das macht....
Sorry für die Nachfrage und danke schon mal. Stefan
Du kannst auf deinem Windows Recher auch npm installieren und anschließend darüber das benötigte Paket installieren: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
Ich überlege gerade aber, ob ich deinen Vorschlag umsetze. Dazu müsste ich folgendes machen (kannst du auch von Hand machen, wenn du kein npm installieren willst).
- Die Typdefinitionen von npm herunterladen: https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz
- Nach
node_modules/@types/nodeentpacken
Ich lass den Issue hier offen, weiß aber noch nicht genau, wann ich dazu komme das umzusetzen.
Danke für die Hilfe, ich habe es mal ausprobiert:
- Datei https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz heruntergeladen
- Nach
C:\Program Files\Microsoft VS Code\resources\app\node_modules\@typesentpackt. Das "node"-Verzeichnis ist im TGZ schon mit drin.
Sieht dann folgendermaßen aus:
Danach VS Code neu gestartet.
Der Fehler bleibt bestehen... vermutlich muss ich noch irgendwas machen, weil in der Datei
'node_modules/@types/node/timers.d.ts' ist die Klasse Timeout im namespace NodeJS definiert.
Hast du eine Ahnung, warum VS Code das nicht nutzt und kannst mir bitte einen Schubs in die richtige Richtung geben?
Hallo Niklas,
ich denke, ich bin ein Stück weiter gekommen. In der Datei tsconfig.json steht:
{
"compileOnSave": true,
"compilerOptions": {
"noEmit": true,
"allowJs": true,
"checkJs": true,
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"resolveJsonModule": true,
"strict": true,
"noImplicitAny": false,
"target": "es2018",
"typeRoots": [
".iobroker/types",
"node_modules/@types"
]
},
"include": [
"**/*.js",
"**/*.ts",
".iobroker/types/javascript.d.ts",
".iobroker/types/global.d.ts"
],
"exclude": [
"node_modules/**"
]
}
Hier sind zwei typeRoots genannt. Und obwohl ".iobroker/types" eine typeRoot ist, werden bei include z.B. ".iobroker/types/javascript.d.ts" explizit genannt. Muss das auch bei den node-Typen geschehen?
Wenn ich
- die Datei https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz heruntergeladen
- und dann nach
<projektfolder>\.iobroker\typesentpacke findet VS Code die Typen korrekt.
Leider werden die ganzen Dateien dann aber auch durchsucht, wenn man die Search-Funktion nutzt, das macht die Suche sehr schwierig...
Lösung ist wie von Niklas vorgeschlagen -- was ich aber nicht umsetzen konnte, da ich mich zu wenig auskannte, daher eine Schritt-für-Schritt-Anleitung für Einsteiger wie mich:
- Die Typdefinitionen von npm herunterladen: https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz
- Ins root directory deines ioBroker-Workspaces wechseln (dort liegt auch die Datei
.iobroker-config.jsonund alle Skripte, die von ioBroker gesynct werden -- NICHT in das existierendenode_modules\@typesVerzeichnis im Installationspfad von VS CodeC:\Program Files\Microsoft VS Code\resources\app\node_modules\@types!!!!) - Verzeichnis
node_modulesanlegen und in das Verzeichnisnode_moduleswechseln - Verzeichnis
@typesanlegen und in das Verzeichnis@typeswechseln - Dorthin die
node-20.14.10.tgzentpacken. Dabei sollte einnode-Verzeichnis angelegt werden
Nun sollten die NodeJS Namespaces erkannt werden.
Tut mir leid, dass ich es nicht gut genug beschrieben habe, es freut mich aber, dass du es trotzdem hinbekommen hast :-)