2017-12-16 1 views
1

müsste ich den Dateinamen einer importierten Klasse erhalten:js erhalten Dateinamen-Datei mit Klassendefinition

fileA.js

export default class User { 
} 

fileB.js

import User from './fileA' 

function getClassFilename(constructor) { 
    // do something like __filename, but to get the filename where User is defined rather than the current filename 
} 

console.log(getClassFilename(User.constructor)) // fileA.js 

Dies ist Grund Idee. Allerdings ist die tatsächliche Anwendungsfall basiert auf Dekorateure:

fileA.js

import someDecorator from './decorator' 

@someDecorator 
class User { 
} 

decorator.js

export default function (target) { 
    // can I somehow get the target filename without passing it as a property? 
} 

Antwort

1

Diese Informationen, die Ihnen nicht standardmäßig verfügbar ist, würde das Modul in Frage müssen einen Zugang zu den Informationen bereitstellen.

Sie haben __filename erwähnt, also nehme ich an, dass Sie Node verwenden. Das Modul bietet User, dass Informationen wie diese bieten könnte:

export const SourceFilename = __filename; 

Hinweis Täht Es gibt keine in-spec Art und Weise zu tun, ohne Knoten des __filename (aber es gibt eine under consideration und einigermaßen weit auf dem Weg in Richtung hinzugefügt werden).


aktualisiert Antwort auf aktualisierte Frage: Es gibt nichts auf der Klasse (Konstruktor) gespeichert User, die diese Informationen zur Verfügung stellt. Also wieder, der Code, der User definiert, würde diese Information zur Verfügung stellen müssen (als eine Eigenschaft auf User, als etwas, das Sie vom Modul erhalten können und separat zum Dekorateur, etc. weiterleiten). Ansonsten steht es Ihnen einfach nicht zur Verfügung.

+0

Vielen Dank für den Vorschlag. Leider musste ich nun feststellen, dass ich versucht habe, meinen Anwendungsfall zu sehr zu verallgemeinern, da ich versuche, den Dateinamen innerhalb eines Dekorators zu finden, der auf die Klasse angewendet wird. Ich werde die Frage aktualisieren. Entschuldigung dafür – Chris

+0

@Chris: Im Grunde die gleiche Antwort (ich habe aktualisiert): Wenn das Modul die Informationen nicht zur Verfügung stellt, werden Sie nicht haben, damit zu arbeiten. –

+1

Toller Hinweis. Ich kann den Namen der Klasse einfach als eine Eigenschaft hinzufügen, auf die ich dann zugreifen kann, ohne sie explizit exportieren/importieren zu müssen. – Chris