I have got these two interfaces in Typescript:
interface User {
id: string
name: string
}
and
interface Employee {
position: string
department: string
}
I would like to use like this:
{ // valid
id: 'some-id',
name: 'some-name',
}
{ // valid
id: 'some-id',
name: 'some-name',
position: 'some-position',
department: 'some-department',
}
but want it to fail when:
{ // invalid
id: 'some-id',
name: 'some-name',
position: 'some-position',
}
{ // invalid
id: 'some-id',
name: 'some-name',
department: 'some-department',
}
and my solution is:
type EmployeeAndUser = User & Employee;
type EmployeeUser = (User & { position: never, department: never }) | EmployeeAndUser;
const bilbo: EmployeeUser = {
id: '123',
name: 'bilbo',
position: 'hobbit',
department: 'shire'
}
Note this does not work the way I want because Typescript thinks it's User:
interface EmployeeUser extends User {
position: string
department: string
}
// this is valid
const bilbo: User | EmployeeUser = {
id: '123',
name: 'bilbo',
position: 'asd',
}
My solution is a little verbose and I feel like there must be a better way.
How could it be better?