Машинописный декоратор вызывается дважды - PullRequest
0 голосов
/ 12 июля 2020

Я создал отчет о проблеме с помощью Typescript , потому что я почти уверен, что это ошибка, но я хотел проверить и здесь, на всякий случай, если у кого-то есть дополнительная информация.

Это это то, что происходит. Когда выполняется следующий код :

class Person {
    @IsValueIn(['PETER', 'JAMES'])
    @IsAlpha()
    @IsDefined()
    public name:string;
}

Он будет записывать это:

Error in /turbo_modules/@fireflysemantics/validator@3.0.10/bundles/fireflysemantics-validator.umd.js (194:21)
The ValidationContainer
already contains context with signature IsValueIn_Person_name.

Но если мы закомментируем @IsValueIn(['PETER', 'JAMES']):

class Person {
    //@IsValueIn(['PETER', 'JAMES'])
    @IsAlpha()
    @IsDefined()
    public name:string;
}

Нет никаких исключений.

Когда среда выполнения видит и создает декоратор, вызывается следующая функция (я добавил операторы регистрации, которые показывают, что декоратор вызывается дважды):

  /**
   * @param target Add a ValidationContext instance.
   * @throws Error if attempting to add a ValidationContext with a signature that duplicates that of an instance already contained.
   * 
   * If an exception thrown it indicates that a duplicate class definition exist
   * in the runtime.  In other words the same class definition is loaded more
   * than once because it exists in multiple files.
   * 
   */
  public static addValidationContext(target: ValidationContext): void {

    const key: string = getPropertyKey(
      target.target.name,
      target.propertyName
    );

    console.log("The property key is: ", key)
    console.log("The target signature is: ", target.getSignature())

Это выполняемые операторы регистрации:

ValidationContainer.ts:69 The target signature is:  IsDefined_Person_name
ValidationContainer.ts:68 The property key is:  Person_name
ValidationContainer.ts:69 The target signature is:  IsAlpha_Person_name
ValidationContainer.ts:68 The property key is:  Person_name
ValidationContainer.ts:69 The target signature is:  IsValueIn_Person_name
ValidationContainer.ts:68 The property key is:  Person_name
ValidationContainer.ts:69 The target signature is:  IsValueIn_Person_name

Как можно видеть, IsValueIn_Person_name создается дважды в результате того, что экземпляр декоратора происходит дважды, и это вызывает исключение.

Мысли?

1 Ответ

2 голосов
/ 13 июля 2020

Предположение, что декоратор вызывается дважды на основе журналов, неверно.

В текущем источнике:

export function IsValueIn(target: any[], validationOptions?: ValidationOptions) {

  const validationParameters:any[] = [];
  validationParameters.push(target);

  return function(object: any, propertyName: string) {
    const vc: ValidationContext = new ValidationContext(
      object,
      object.constructor,
      IsValueIn.name,
      propertyName,
      validateValue,
      null,
      true,
      errorMessage,
      validationOptions
    );
    ValidationContainer.addValidationContext(vc);
    ValidationContainer.addValidationContext(vc);
  };
}

ValidationContainer.addValidationContext(vc); вызывается дважды и производит эти двойные журналы.

Просто избавьтесь от строки 33 или 34 ;)

...