У меня есть класс, который содержит частное свойство, которое является массивом. Существует публичный геттер и сеттер, чтобы гарантировать, что манипулирование данными вызывает требуемую бизнес-логику.Вызов открытого скрипта скриптов изменяет частную собственность без запуска логики, содержащейся в общедоступном сетевом уровне
У меня возникла проблема, когда вызывающий пользователь смог установить частную собственность, не запуская связанную логику, содержащуюся в публичном сетевом устройстве.
я воспроизвел этот вопрос с помощью этого простого кода:
class Greeter {
private _greetings: string[];
constructor() {}
set greetings(greetings: string[]) {
let newGreetings: string[] = [];
for (let i: number = 0; i < greetings.length; i++) {
newGreetings.push("setter_" + greetings[i])
}
this._greetings = newGreetings;
}
get greetings() {
return this._greetings;
}
}
let greeter = new Greeter();
greeter.greetings = ["test"];
let test1 = document.createElement('p');
test1.textContent = greeter.greetings[0];
document.body.appendChild(test1);
greeter.greetings[0] = "test";
let test2 = document.createElement('p');
test2.textContent = greeter.greetings[0];
document.body.appendChild(test2);
Чтобы просмотреть код в детской площадке TS, следуйте ниже ссылке:
Мой вопрос: Могу ли я делать что-то неправильно? Это предполагаемое поведение? Или это больше проблема с машинописным компилятором, который не должен позволять компиляции этого кода?
Какая часть в этом случае неожиданна? –
Я бы ожидал, что в обоих случаях значение будет: setter_test – user1769949