微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

打字稿类装饰器:重写构造函数,但保留类名称?

如何解决打字稿类装饰器:重写构造函数,但保留类名称?

打字稿手册中有一个示例,说明如何使用类装饰器覆盖构造函数link):

function classDecorator<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  return class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
}

@classDecorator
class Greeter {
  property = "property";
  hello: string;
  constructor(m: string) {
    this.hello = m;
  }
}

当我注销结果类的实例时,该类名丢失:

console.log(new Greeter("world"));
//=> { "property": "property","hello": "override","newProperty": "new property" }

现在,如果我修改装饰器以将新类分配给变量,则日志将包含该变量的名称

function classDecorator2<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  const MyDecoratedClass = class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
  return MyDecoratedClass
}


@classDecorator2
class Greeter2 {
  // ... same as Greeter
}


console.log(new Greeter2("world"));
//=> MyDecoratedClass: { "property": "property","newProperty": "new property" } 

有没有一种方法可以在控制台输出中保留该类的原始名称?例如。我希望最后一个控制台语句的输出

Greeter2: { "property": "property","newProperty": "new property" }

打字稿沙箱here中可用的所有代码示例

解决方法

您可以尝试这样的操作,虽然看起来有些怪异。

function classDecorator<T extends { new (...args: any[]): {} }>(
  constructor: T
) {
  const cls = class extends constructor {
    newProperty = "new property";
    hello = "override";
  };
  Object.defineProperty(cls,'name',{
    get: () => `${constructor.name}Generated`
  });
  return cls
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。