У меня есть класс Car с некоторой информацией об автомобиле, включая табличку, теперь я хочу проверить табличку свойств, поэтому я использую декоратор свойств следующим образом:
class Car{
@validate
public plate: string;
public model: string;
// extra info
constructor(plate: string, model: string){
this.plate= plate;
this.model = model;
}
toString(): string{
return `Car: ${this.plate} - ${this.model}`;
}
}
Тогда у меня есть следующий декоратор свойствфункция:
function validate(target: any, propertyKey: string){
let value = target[propertyKey];
Object.defineProperty(target, propertyKey, {
get: () => value,
set: (newValue) => {
const pattern = /^[A-Z]{2}\s?[0-9]{3}\s?[A-Z]{2}$/;
if(pattern.test(newValue)){
value = newValue;
} else {
console.error('Non valid plate: ', newValue);
//value = undefined;
}
}
})
}
Теперь, если я проверю свой код следующим образом:
const car1 = new Car('IT123UE', 'Car1Model');
console.log('1 - ', car1.toString());
const car2 = new Car('IT000000UE', 'Car2Model');
console.log('2 - ', car2.toString());
Я получу:
1 - Car: IT123UE - Car1Model
Non valid plate: IT000000UE
2 - Car: IT123UE - Car2Model <-- why print car1.plate if car2.plate is not valid and this is car2 object?
Я решил использовать значение = неопределенное;в остальном внутри моей функции проверки, но я не понимаю, почему в моем car2.plate я получаю значение car1.plate.Еще один тест, если я изменю порядок:
const car2 = new Car('IT000000UE', 'Car2Model');
console.log('2 - ', car2.toString());
const car1 = new Car('IT123UE', 'Car1Model');
console.log('1 - ', car1.toString());
Я получаю:
Non valid plate: IT000000UE
2 - Car: undefined - Car2Model <- now is undefinied
1 - Car: IT123UE - Car1Model
, что я ожидал, но почему это не сработало раньше?
IЯ использую TS 3.4.5 с VS Code, а в tsconfig у меня есть
"target": "es6",
"experimentalDecorators": true,