Is it possible to set field values from object using TypeOrm preserving type safity?
All examples I found in the documentation suggest you to set properties one-by-one
const newUser = new User();
newUser.firstName = 'John'
newUser.lastName = 'Doe'
newUser.role = 'manager'
newUser.phone = '1234567890'
newUser.login = 'john.doe'
newUser.password = '12345'
newUser.save();
It would be much nicer if I could set fields this way:
const newUser = new User();
newUser.setFields({
firstName: 'John',
lastName: 'Doe',
role: 'manager',
phone: '1234567890',
login: 'john.doe',
password: '12345'
}
);
newUser.save();
It would allow to use shortcuts
const newUser = new User();
newUser.setFields({
firstName,
lastName,
role,
phone,
login: 'john.doe',
password: '12345'
}
);
newUser.save();
And use composition
const newUser = new User();
newUser.setFields({
firstName,
lastName,
role,
phone,
...credentials
}
);
newUser.save();
though I could not find any way to do so.
I understand that by you need to have a type describing shape of your object in order to achieve it but I was hoping TS/TsOrm can derive it somehow from models I define.
The create
and merge
method of an entity or repository (depending on your implementation) will be what you're looking for most likely:
const userEntity = UserEntity.create({ firstName, lastName, ...someOtherStuff });
const mergedEntity = UserEntity.merge(mergedEntity, { lastName: "new last name" });
For further information consult the documentation and scroll down to the mentioned methods which includes the following samples:
const user = repository.create(); // same as const user = new User();
const user = repository.create({
id: 1,
firstName: "Timber",
lastName: "Saw"
}); // same as const user = new User(); user.firstName = "Timber"; user.lastName = "Saw";
const user = new User();
repository.merge(user, { firstName: "Timber" }, { lastName: "Saw" });
// same as user.firstName = "Timber"; user.lastName = "Saw";