/附加答案
由于即使在 uglifying 之后您还需要原始类的实际名称,所以您需要查看您的构建过程。
你说你使用 angular-cli,它在后台使用 UglifyJS 进行丑化。 UglifyJS 支持保留原始类名的标志,甚至是应该忽略的类名的白名单。具体来说,它是您感兴趣的 mangler 部分。The official website 甚至提到它会使用 Function.name 破坏代码。
您可以完全禁用 mangling,或者您可以专门禁用 mangling 类名(或将某些类名列入白名单)。我认为 angular-cli 不可能做到这一点(在 webpack 中你可以),但你正在寻找的标志是 keep-classnames 或 keep_fnames。但是,angular-cli 团队已经表示multiple times 不支持这种粒度级别的配置。
那么你似乎有两个选择:
- 切换到完整的 webpack(ng eject 可以帮助你)
- 硬编码类名
像这样:
class MyClass {
className = 'MyClass';
}
什么是 ng 弹出?引用dave11mj's comment:
ngject 仅仅意味着你需要用 webpack 做一些比 cli 为 ng build 和 ng serve 等命令提供的更高级或自定义的东西。所以它会生成一个 webpack.config。 js 基于 cli 使用的配置,以便您可以进一步自定义它。
因此,只要 angular-cli 本身不支持 UglifyJS 的配置,这听起来肯定是为您的情况而设计的。
/原始答案(在禁用 UglifyJs 修改后仍然有用)
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) {
(..)
}
}