在类型脚本5中,属性decorator 的类型定义已经更改,似乎没有一种方法可以获得类的构造函数.

它现在实现TC39 proposal,其中属性修饰符的第一个参数始终为undefined:

type ClassFieldDecorator = (value: undefined, context: {
  kind: "field";
  name: string | symbol;
  access: { get(): unknown, set(value: unknown): void };
  static: boolean;
  private: boolean;
}) => (initialValue: unknown) => unknown | void;

而在前面,装饰符函数的第一个参数是类的构造函数:

function myPropertyDecorator(target: Object, propertyKey: string) { 
  ...
}

获取类的构造函数的能力对于一些库非常有用,例如验证库,这些库在类级别上操作,并存储每个类的验证映射.

对于新的装修师的提案,有什么 Select 呢?

  1. 在初始化函数中获得一个类构造函数?
  2. experimentalDecorators个而不是新的装修工?
  3. 还有别的事吗?

推荐答案

您可以在修饰器的回调函数中访问类实例:

function propDecorator(value: undefined, ctx: ClassFieldDecoratorContext) {
    return function (this: any, initialValue: any) {
      console.log(this, this.constructor)
      return initialValue;
    };
}

class C {
  @propDecorator x = 1;
}

new C();

确保不使用箭头函数来不保留修饰符函数的上下文.

Playground

Typescript相关问答推荐

为什么缩小封闭内部不适用于属性对象,但适用于声明的变量?

如何访问Content UI的DatePicker/中的sx props of year picker?'<>

为什么tsx不判断名称中有"—"的属性?'

TypeScrip 5.3和5.4-对`Readonly<;[...number[],字符串]>;`的测试版处理:有什么变化?

为什么不能使用$EVENT接收字符串数组?

如何在NX工作区项目.json中设置类似angular.json的两个项目构建配置?

如何使用模板继承从子组件填充基础组件的画布

如何在方法中正确地传递来自TypeScrip对象的字段子集?

如何在typescript中为this关键字设置上下文

为什么我的动画状态在组件实例之间共享?

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

在抽象类构造函数中获取子类型

有没有办法在Reaction组件中动态导入打字脚本`type`?

为什么受歧视的unions 在一种情况下运作良好,但在另一种非常类似的情况下却不起作用?

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

如何将元素推入对象中的类型化数组

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

如何使用布尔值构建对象 TYPE,但至少有一个必须为 true

Mongodb TypeError:类继承 events_1.EventEmitter 不是对象或 null