import { And, AndArr } from "./and"; import { IsEqual } from "./equal"; import { Extends } from "./extends"; import { IsNever } from "./never"; import { Not } from "./not"; import { Or } from "./or"; import { Prettify } from "./prettify"; import { IsUnknown } from "./unknown"; export type OverWritable = { overwriteDefault?: boolean; }; export type ApplyDefaultOptions< BaseOptions, Options extends BaseOptions, DefaultOptions extends BaseOptions, OverwriteRules, OverwriteDefault extends boolean = false > = Prettify<{ [K in keyof BaseOptions]-?: K extends keyof Options ? AndArr< [ Extends, object>, Not>, Not> ] > extends true ? ApplyDefaultOptions< NonNullable, Options[K], DefaultOptions[K], OverwriteRules[K & keyof OverwriteRules], OverwriteDefault > & { tra: "test"; } : Or< IsEqual, And< Extends, Extends > > extends true ? Options[K] : Options[K] | DefaultOptions[K] : DefaultOptions[K]; }>;