Nehmen wir an, ich habe eine Datei mit dem Namen “File1.js”. In diese Datei exportiere ich ein Objekt von Objekten und gebe jedem Objekt eine Typdefinition, so ähnlich.
/**
* My typedef for each object.
* @typedef {Object} MyObject1
* @property {String} username Your username
* @property {String} realname Your real name.
* @property {boolean} isUnique Are you unique as a person?
*/
module.exports = {
/**
* Person One!
* @type {MyObject1}
*/
myperson: {
username: 'TheDragonSlayer',
realname: 'George',
isUnique: true
},
/**
* Person Two!
* @type {MyObject1}
*/
myperson2: {
username: 'BobMagee',
realname: 'Bob',
isUnique: false
}
}
Jetzt referenziere ich in einer Datei namens „File2.js“ dieses Objekt in einem Konstruktor und setze es auf „new“. MyObject1
.
const persons = require('./File1.js');
class File2 {
constructor(options = {}) {
/**
* The person for this file.
* @type {MyObject1}
*/
this.person = options.person ? persons[options.person] : persons.myperson2;
}
}
module.exports = File2;
Ich verwende Visual Studio Code zum Entwickeln, also erhalte ich IntelliSense, indem ich Strg+Leertaste drücke. In Datei eins und während ich die Personenobjekte erstelle, teilt mir IntelliSense mit, dass username ein String, realname ein String und isUnique ein boolescher Wert ist. Aber wenn ich in file2 gehe und auf die neu erstellte Person über verweise this.person
beim Tippen this.person.username
es kommt nicht mit dem erwarteten Ergebnis von “Username: String”.
Ist es möglich, die Typedef MyObject1
in File2 in Vanilla Node.js, oder habe ich Pech?
Bearbeiten: Mit einigen weiteren Informationen konnte ich Antworten mit @export und @import für TypeScript sowie eine Art Tag finden, die ich ebenfalls ausprobiert habe. All das vergeblich. Ich habe auch versucht, File1.js als @module zu markieren und zu tun module:mymodule~MyMethod
aber jedes Mal, wenn ich das tat, wurde this.person nur als NodeModule anstelle der Methode selbst markiert.
Meintest du
@typedef
anstatt@typdef
in Datei1?– Peter g
14. April 2018 um 22:42 Uhr
@ PeterG Ja, das tut mir leid!
– FireController1847
14. April 2018 um 22:47 Uhr
Es kann eher eine Frage sein, wie intelligent Intellisense ist, als eine JSDoc-Sache. Bei der Verwendung von WebStorm IDE habe ich festgestellt, dass dieses Szenario wie erwartet funktioniert, aber ich finde oft Grenzen für die JSDoc-Unterstützung – zum Beispiel funktioniert es nicht wie erwartet, wenn sich @typedef in einem Abhängigkeitsprojekt befindet.
– Justin Emery
19. April 2018 um 8:55 Uhr
Es gibt einen entsprechenden Kommentar zu der einen Antwort unten, aber
import("some-module")
wird von Typescript unterstützt, ist es aber nicht offizielles JSDoc.– Kodierer
21. Januar 2021 um 11:22 Uhr
Auch mit
import "./types.js"
und @typedef in der Datei “types.js” funktioniert für mich.– aderchox
15. September 2022 um 17:08 Uhr