/补充答案
由于即使在丑化之后您也需要原始类的实际名称,因此您将需要查看您的构建过程。
你说你使用 angular-cli,它在幕后使用 UglifyJS 进行丑化。 UglifyJS 支持保留原始类名的标志,甚至支持应忽略的类名白名单。具体来说就是mangler您感兴趣的部分。官方网站甚至提到它会破坏代码Function.name
.
您可以完全禁用重整,也可以专门禁用重整类名(或将某些类名列入白名单)。我不认为这对于 angular-cli 是可能的(在 webpack 中你可以),但是你正在寻找的标志是keep-classnames
or keep_fnames
。然而,Angular-CLI 团队表示多次它不支持这种粒度级别的配置。
那么你似乎还有两个选择:
- 切换到完整的 webpack (ng eject可以帮助你)
- 硬编码类名
Like so:
class MyClass {
className = 'MyClass';
}
什么是 ng 弹出?引用dave11mj 的评论:
ng eject只是意味着你需要使用 webpack 做一些比 cli 为 ng build 和 ngserve 这样的命令提供的更高级或自定义的事情。所以它会根据 cli 使用的配置生成一个 webpack.config.js ,以便然后您可以进一步自定义它。
因此,只要 angular-cli 本身不支持 UglifyJS 配置,听起来它肯定是为您的情况而设计的。
/原始答案(在禁用 UglifyJs mangling 的情况下仍然有用)
class MyClass {
className = this.constructor.name;
}
const instance = new MyClass();
console.info(instance.className); // yields "MyClass"
如果您使用 TypeScript >= 2.1,则类型string
由编译器推断。
jsFiddle
如果你有一个构造函数,你也可以像这样定义它并完全省略显式字段(根据喜好,两者的工作原理相同):
class MyClass {
constructor(public className = this.constructor.name) {
(..)
}
}