I have one interface with many fields and other interface with almost all fields (just one less).
How in TypeScript without untyped unsafe crutches (<>
, as
, any
, unknown
and similar) can one exclude fields in object spread (so without enumerating every field I want to copy)?
interface A {
fieldA: number;
fieldB: string;
fieldC: number;
fieldD: string;
fieldE: number;
fieldF: string;
}
interface B {
fieldA: number;
fieldB: string;
fieldC: number;
fieldD: string;
fieldE: number;
// no fieldF here
}
const a: A = {
fieldA: 1,
fieldB: 'b',
fieldC: 3,
fieldD: 'd',
fieldE: 5,
fieldF: 'f'
}
const b: B = {
...a,
fieldF: undefined
};
This doesn't compile, because fieldF is still present, only have a value of undefined
.
If you don't mind an intermediate step, you can do something like this:
const { fieldF, ...everythingExceptF } = a;
const b: B = everythingExceptF;
This combines the spread and rest operators. The compiler seemed happy with this on my machine, and it gives me the result you'd expect.
Note: this will also create the constant fieldF
, which you may or may not want. If you already need that name for some other reason in the same scope, you can reassign it like this:
const { fieldF: someOtherName, ...everythingExceptF } = a;