export class User {
private readonly props: UserProps;
constructor(props: UserProps) {
this.props = userSchema.parse(props);
for (const key of Object.keys(props) as Array<keyof UserProps>) {
Object.defineProperty(this, key, {
get: () => this.props[key],
enumerable: true,
});
}
}
}
const user = new User({firstname: 'John', /* other fields */});
console.log(user.firstname); // TS2339: Property firstname does not exist on type User
const user = userRepository.getById(123); // get user from db, return User
user.changeFirstname('John2'); // validate, write
userRepository.save(user); // update user in db
Или же вообще ничего не делать, всё равно с базы тебе уникальный объект придёт,
хочется классы, запихни в свойство класса сгенерированные геттеры
геттеры нужны на случай если исходное имя поля изменится, чтобы ничего в публичном апи не сломалось.
Это понятно, но изменяться будет он-же, он же и хранит логику для полей.
Прокси хорошо - но от дублирования не спасает, а это основная проблема сейчас.
Потеряется user.field, user.v.field странно выглядит.
const user = userRepository.getById(123);
user.changeFirstname('John2'); // проверяем вход => записываем в User.firstname
userRepository.save(user);
user.changeFirstname('John2'); // проверяем вход => записываем в User.firstname
userRepository.save(user); любые проверки можно делать на этом этапе: userRepository.save(user);