Hi,
I would like to have merge types of two objects but have a union of "each" attribute individually (not whole object).
Example
interface A {
id: number;
serial: number;
}
interface B {
id: string;
serial: string;
}
type C = Partial<A> | Partial<B>;
// I want to have combined type below:
const c: C = { id:3, serial: "j" }; // ERROR: Both must be number or both must be string
I couldn't find the necessary types in type-fest
. Is it possible?
If not, there is a solution. The idea is not mine, I found it here, could you please consider adding this:
interface A {
id: number;
serial: number;
}
interface B {
id: string;
serial: string;
}
type Compute<T> = { [K in keyof T]: T[K] } | never;
type AllKeys<T> = T extends any ? keyof T : never;
type MergeUnion<T, Keys extends keyof T = keyof T> = Compute<
{ [K in Keys]: T[Keys] } & { [K in AllKeys<T>]?: T extends any ? (K extends keyof T ? T[K] : never) : never }
>;
type C = Partial<A> | Partial<B>;
type D = MergeUnion<A | B>;
const c: C = { id:3, serial: "j" }; // ERROR
const d: D = { id:3, serial: "j" }; // OK
Pay now to fund the work behind this issue.
Get updates on progress being made.
Maintainer is rewarded once the issue is completed.
You're funding impactful open source efforts
You want to contribute to this effort
You want to get funding like this too