js 获取包含 class 定义的文件的文件名
js get filename of file containing class definition
我需要获取导入的文件名 class:
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
这是大意。然而,实际用例是基于装饰器的:
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?
}
默认情况下您无法使用该信息,相关模块必须提供访问该信息的方法。
您已经提到 __filename
所以我假设您使用的是 Node.提供 User
的模块可以提供这样的信息:
export const SourceFilename = __filename;
请注意,如果没有 Node 的 __filename
,就没有符合规范的方法来做到这一点(但是有一个 under consideration 并且在添加的道路上相当远)。
更新问题的更新答案:class(构造函数)User
上没有存储提供此信息的任何内容。因此,再次定义 User
的代码需要提供该信息(作为 User
上的 属性,作为您可以从模块中获取并单独传递给装饰器等的东西) .否则,您根本无法使用它。
我需要获取导入的文件名 class:
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
这是大意。然而,实际用例是基于装饰器的:
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?
}
默认情况下您无法使用该信息,相关模块必须提供访问该信息的方法。
您已经提到 __filename
所以我假设您使用的是 Node.提供 User
的模块可以提供这样的信息:
export const SourceFilename = __filename;
请注意,如果没有 Node 的 __filename
,就没有符合规范的方法来做到这一点(但是有一个 under consideration 并且在添加的道路上相当远)。
更新问题的更新答案:class(构造函数)User
上没有存储提供此信息的任何内容。因此,再次定义 User
的代码需要提供该信息(作为 User
上的 属性,作为您可以从模块中获取并单独传递给装饰器等的东西) .否则,您根本无法使用它。