Wie “importiert” man eine Typedef von einer Datei in eine andere in JSDoc mit Node.js?

Lesezeit: 3 Minuten

Benutzeravatar von FireController1847
FireController1847

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.personbeim 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~MyMethodaber 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

Importieren Sie den deklarierten Typ in Ihre Datei File2.js mit der Funktion import.

const persons = require('./File1.js');

/**
 * @typedef {import('./File1.js').MyObject1} MyObject1
 */

class File2 {
...

Für mich geht das.

Geben Sie hier die Bildbeschreibung ein
Geben Sie hier die Bildbeschreibung ein

  • Großartig! Das hat es tatsächlich behoben! Ich danke dir sehr!

    – FireController1847

    17. Oktober 2018 um 5:11 Uhr

  • Dies ist eine TypeScript-spezifische Syntax. Stimmen Sie ab github.com/jsdoc/jsdoc/issues/1645.

    – Glen-84

    28. Mai 2020 um 10:42 Uhr

  • Offizielle Dokumente für Importtypen: typescriptlang.org/docs/handbook/…

    – Georgij Bucharow

    22. November 2021 um 10:41 Uhr


  • Jede Möglichkeit, nicht wiederholt zu tippen import('./File1.js')? (wenn ich zB auch brauche file1.MyObject2 und file1.MyObjectN). – Tun @typedef {import('./File1.js')} file1 und @typedef {file1.MyObject2} MyObject2 MyObject2 wird nur mit einem Alias ​​versehen und verliert Definitionsdetails, wodurch es als markiert wird /*unresolved*/ any.

    – Kamafeder

    29. August 2022 um 16:00 Uhr


Eine andere Sache, die ich beim Arbeiten entdeckt habe, ist das Exportieren und Leeren des Modells und die Verwendung als Referenz für die Typen:

Typen.js:

/** 
* @typedef MyType 
* @prop {string} name  
* @prop {string} description 
*/

export const Types = {}

Dann können Sie das in Ihre anderen Dateien importieren und die Typen von diesem Dummy-Objekt haben:

Datei1.js

import * as Types from "./types.js"

/** @type {Types.MyType} */
const myVar = { name : 'Roy', description : 'abc123'};

Vorteile:

  • viel “sauberer” – weniger Code zu schreiben
  • muss nur einmal importiert werden

Nachteile:

  • ein bisschen hackelig
  • nicht idiomatisch
  • Sie erhalten möglicherweise den Fehler:

Dieser Import wird nie als Wert verwendet und muss „Importtyp“ verwenden, da „importsNotUsedAsValues“ auf „Fehler“ gesetzt ist.

Wenn Sie diese Flagge haben.

Um diese Warnung zu umgehen, müssen Sie sie nur mit einem ts-ignore deaktivieren:

// @ts-ignore  
import * as Types from "./types.js";

1438520cookie-checkWie “importiert” man eine Typedef von einer Datei in eine andere in JSDoc mit Node.js?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy