joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

在 TypeScript 中,装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、访问符、属性或参数上。下面是一些常见的装饰器示例:

1. 类装饰器

类装饰器用于类声明之前,用来监视、修改或替换类定义。

function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@sealed
class Greeter {
  greeting: string;
  constructor(message: string) {
    this.greeting = message;
  }
  greet() {
    return `Hello, ${this.greeting}`;
  }
}

2. 方法装饰器

方法装饰器用于方法声明之前,用来监视、修改或替换方法定义。

function enumerable(value: boolean) {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    descriptor.enumerable = value;
  };
}

class Greeter {
  greeting: string;
  constructor(message: string) {
    this.greeting = message;
  }

  @enumerable(false)
  greet() {
    return `Hello, ${this.greeting}`;
  }
}

3. 访问器装饰器

访问器装饰器用于访问器声明之前,用来监视、修改或替换访问器定义。

function configurable(value: boolean) {
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    descriptor.configurable = value;
  };
}

class Person {
  private _name: string;

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

  @configurable(false)
  get name() {
    return this._name;
  }

  set name(newName: string) {
    this._name = newName;
  }
}

4. 属性装饰器

属性装饰器用于属性声明之前,用来监视、修改或替换属性定义。

function readonly(target: any, propertyKey: string) {
  Object.defineProperty(target, propertyKey, {
    writable: false
  });
}

class Person {
  @readonly
  name: string;

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

5. 参数装饰器

参数装饰器用于参数声明之前,用来监视、修改或替换参数定义。

function logParameter(target: any, propertyKey: string, parameterIndex: number) {
  const metadataKey = `__log_${propertyKey}_parameters`;

  if (Array.isArray(target[metadataKey])) {
    target[metadataKey].push(parameterIndex);
  } else {
    target[metadataKey] = [parameterIndex];
  }
}

class Greeter {
  greeting: string;
  constructor(message: string) {
    this.greeting = message;
  }

  greet(@logParameter name: string) {
    return `Hello, ${name}`;
  }
}

这些示例展示了如何使用装饰器来增强和修改类及其成员。希望这些示例对你有帮助!

posted on 2024-12-09 20:05  joken1310  阅读(121)  评论(0)    收藏  举报