Search code examples
typescriptormtypeorm

Is it possible to set field values from object using TypeOrm?


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.


Solution

  • 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";