-
Notifications
You must be signed in to change notification settings - Fork 44
Open
Description
It would be super useful to have utility type for merge multiple types using @type
as array.
For example:
type UnionToIntersection<T> = (
T extends any ? (arg: T) => any : never
) extends (arg: infer I) => any
? I
: never;
type MergeTypes<
T extends { "@type": string }[],
R extends unknown[] = [],
> = T extends [
infer I extends { "@type": string },
...infer J extends { "@type": string }[],
]
? UnionToIntersection<I["@type"]> extends never
? I
: MergeTypes<J, [...R, I["@type"]]>
: R;
type MergePropertiesExceptForTypes<T extends unknown[], R = {}> = T extends [
infer I,
...infer J,
]
? MergePropertiesExceptForTypes<J, Omit<I, "@type"> & R>
: R;
export type MergeSchema<T extends { "@type": string }[]> =
MergeTypes<T> extends unknown[]
? MergePropertiesExceptForTypes<T> & { "@type": MergeTypes<T> }
: "Error: Leaf types expected." & { got: MergeTypes<T> };
// === Example Below
import { Product, SheetMusic } from "schema-dts";
type Error = MergeSchema<[Product, SheetMusic]>; // "Error: Leaf types expected." & { got: Product }
type Good = MergeSchema<[Extract<Product, { "@type": "Product" }>, SheetMusic]>;
Eyas
Metadata
Metadata
Assignees
Labels
No labels