nerdamer-ts
Version:
javascript light-weight symbolic math expression evaluator
15 lines (14 loc) • 711 B
TypeScript
declare type OptionalPropertyNames<T> = {
[K in keyof T]-?: ({} extends {
[P in K]: T[K];
} ? K : never);
}[keyof T];
declare type SpreadProperties<L, R, K extends keyof L & keyof R> = {
[P in K]: L[P] | Exclude<R[P], undefined>;
};
declare type Id<T> = T extends infer U ? {
[K in keyof U]: U[K];
} : never;
declare type SpreadTwo<L, R> = Id<Pick<L, Exclude<keyof L, keyof R>> & Pick<R, Exclude<keyof R, OptionalPropertyNames<R>>> & Pick<R, Exclude<OptionalPropertyNames<R>, keyof L>> & SpreadProperties<L, R, OptionalPropertyNames<R> & keyof L>>;
export declare type Spread<A extends readonly [...any]> = A extends [infer L, ...infer R] ? SpreadTwo<L, Spread<R>> : unknown;
export {};