Задать вопрос
Xuxicheta
@Xuxicheta
инженер

Как сделать декоратор разрешенный только для методов заданного типа?

есть класс
export interface IMyClass {
  requiredMethod(): void;
}

class MyClass implements IMyClass {
  @AppendHelix()
  method1(): string {
    return 'my-string';
  }

  @AppendHelix()
  method2(): number {
    return Number.EPSILON;
  }
  requiredMethod(): void { };
}

есть декоратор
export function AppendHelix(): MethodDecorator {
  return function AppendHelixDecorator<T>(
    target: any,
    propertyKey: string | symbol,
    descriptor: TypedPropertyDescriptor<T>
  ): TypedPropertyDescriptor<T> {
    const originMethod = target[propertyKey];
    return {
      value() {
         const origResult = originMethod.apply(this);
         return 'helix ' + origResult;
      },
    } as any as TypedPropertyDescriptor<T>;
  };
}


Задача: описать типы декоратора так, чтобы
@AppendHelix()
method2(): number {
  return Number.EPSILON;
}

вызывало ошибку компиляции, т.е. чтобы декоратор мог накладываться только на методы с определенной сигнатурой, в данном случае возвращающие string
  • Вопрос задан
  • 45 просмотров
Подписаться 1 Сложный Комментировать
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
T у вас это как раз сигнатура метода, поставьте туда что вам надо:

export function AppendHelix() {
  return function AppendHelixDecorator(
    target: any,
    propertyKey: string | symbol,
    descriptor: TypedPropertyDescriptor<() =>string>
  ) {
    const originMethod = target[propertyKey];
    return {
      value() {
         const origResult = originMethod.apply(this);
         return 'helix ' + origResult;
      },
    }
  };
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы