【问题标题】:Typescript: get class name in its own property at compile time打字稿:在编译时在自己的属性中获取类名
【发布时间】:2018-01-25 08:35:29
【问题描述】:

例如,如果我们有这样的类:

class MyClass {
  className: string;
}

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

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

【问题讨论】:

    标签: typescript angular-cli uglifyjs


    【解决方案1】:

    /附加答案

    由于即使在 uglifying 之后您还需要原始类的实际名称,所以您需要查看您的构建过程。

    你说你使用 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:

    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) {
        (..)
      }
    }
    

    【讨论】:

    • 谢谢。我决定暂时使用硬编码字符串。但是,仍然希望 Typescript 包含类似的编译时功能。如果以后遇到更优雅的东西,会更新这个空间。
    • this不能在构造函数中引用
    【解决方案2】:

    你可以使用构造函数来创建一个变量:

    constructor() {
      public c : string = this.constructor.name;
    }
    

    【讨论】:

    • 试过这个,但是当代码被缩小时这不起作用。因此希望将其捕获为编译时间
    【解决方案3】:

    我知道这有点老了,但我遇到了同样的问题,找不到好的解决方案。我不想使用 ng 弹出来关闭或将修改列入白名单,所以我这样做是为了解决它。我没有使用 this.constructor.name,而是创建了一个函数来为我返回对象类型。您必须知道您想要哪些类,并使用 instanceof 运算符在函数中列出每个类。函数如下所示:

    function getType(o: any):string
    {
        if (o instanceof MyClass1)
            return 'MyClass1';
        else if (o instanceof MyClass2)
            return 'MyClass2';
        else
            return null; // class doesn't exist.
    }
    

    要使用这个函数,你可以这样称呼它:

    MyClass1 = myClass1;
    // instead of this:
    console.log(myClass1.constructor.name);
    // call this:
    console.log(getType(myClass1));
    

    因此,在您的情况下,要在编译时运行它,您可以这样做:

    class MyClass {
      className: string = getType(this); // or set the value in a constructor
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2018-02-18
      • 2019-03-12
      • 2021-12-06
      相关资源
      最近更新 更多