Я создал отчет о проблеме с помощью 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
создается дважды в результате того, что экземпляр декоратора происходит дважды, и это вызывает исключение.
Мысли?