gpt4 book ai didi

typescript :在编译时在自己的属性中获取类名

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:43 25 4
gpt4 key购买 nike

例如,如果我们有这样一个类:

class MyClass {
className: string;
}

是否可以在编译时将“MyClass”分配给 className 属性?

编辑:已经尝试过 this.constructor.name。但是,后者对缩小代码没有帮助。因此,当 typescript 代码编译为 JS 时,检查是否有捕获类名的方法。我正在使用 angular-cli。

最佳答案

/附加答案

由于即使在丑化之后您仍需要原始类的实际名称,因此您需要查看您的构建过程。

你说你使用 angular-cli,它在引擎盖下使用 UglifyJS 进行丑化。 UglifyJS 支持保留原始类名的标志,甚至是应该忽略的类名白名单。具体来说,它是您感兴趣的 ma​​ngler 部分。The official website甚至提到它会使用 Function.name 来破坏代码。

您可以完全禁用 mangling,或者您可以专门禁用 mangling 类名(或将某些类名列入白名单)。我不认为这在 angular-cli 中是可能的(在 webpack 中你可以),但你正在寻找的标志是 keep-classnameskeep_fnames。但是,angular-cli 团队已指出 multiple times它不支持这种粒度级别的配置。

那么你似乎还有两个选择:

  1. 切换到完整的 webpack(ng eject 可以帮助您)
  2. 硬编码类名

像这样:

class MyClass {
className = 'MyClass';
}

什么是 ng 弹出?引用 dave11mj's comment :

ng eject simply means you need to do something a lot more advance or custom with webpack than what the cli provides for commands like ng build and ng serve .. So it generates a webpack.config.js based on the configurations that the cli uses, so that you can then customize it further.

因此,只要 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) {
(..)
}
}

关于 typescript :在编译时在自己的属性中获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com