ts-neverfalse
Version:
Automated error coalescing and aggregation to simplify advanced type evaluations in Typescript
75 lines (72 loc) • 2.77 kB
TypeScript
import { R, Unique } from './utils.js';
import { NeverMarked, FalseMarked, Marked } from './interface.js';
import { INCLUDE_T } from './config.js';
type IsError<T> = T extends null ? false : [T] extends [NeverMarked | FalseMarked] ? true : false;
type IsNever<T> = T extends null ? false : T extends NeverMarked ? true : false;
type IsFalse<T> = T extends null ? false : T extends FalseMarked ? true : false;
type WithT<E, T> = E extends {
M: infer M extends string[];
} ? INCLUDE_T extends true ? IsNever<E> extends true ? {
_NEVER: 1;
M: M;
T: T;
} : {
_FALSE: 1;
M: M;
T: T;
} : IsNever<E> extends true ? {
_NEVER: 1;
M: M;
} : {
_FALSE: 1;
M: M;
} : never;
type PrintNever<T, M extends string[]> = R<WithT<{
_NEVER: 1;
M: M;
}, T>>;
type PrintFalse<T, M extends string[]> = R<WithT<{
_FALSE: 1;
M: M;
}, T>>;
type Print<T, M extends string[], Never extends boolean = false> = Never extends true ? PrintNever<T, M> : PrintFalse<T, M>;
type Add<Err extends Marked, ExistingT extends any, Msgs extends string[], NewMsgs extends string[], Never extends boolean> = Err extends NeverMarked ? Never extends true ? PrintNever<ExistingT, [...Msgs, ...NewMsgs]> : PrintFalse<ExistingT, [...NewMsgs]> : Never extends true ? PrintFalse<ExistingT, [...Msgs]> : PrintFalse<ExistingT, [...Msgs, ...NewMsgs]>;
type AddError<Err extends any, Msgs extends string[], Never extends boolean = false, T extends any = null> = Err extends null ? Print<T, Msgs, Never> : Err extends {
M: infer OldMsgs extends string[];
} ? Err extends {
T: infer ExistingT;
} ? Add<Err, ExistingT, OldMsgs, Msgs, Never> : Add<Err, null, OldMsgs, Msgs, Never> : PrintNever<Err, ["Could not parse error"]>;
type MergeWMessages<A extends {
M: any[];
T?: any;
}, B extends {
M: any[];
T?: any;
}, Never extends boolean> = Print<A["T"] | B["T"], Unique<[...A["M"], ...B["M"]]>, Never>;
type MergeWOMessages<A extends {
M: any[];
T?: any;
}, B extends {
T?: any;
}, Never extends boolean> = Print<A["T"] | B["T"], A["M"], Never>;
type MergeVal<Val1, Val2> = Val2 extends Marked ? Val1 extends Marked ? MergeError<Val1, Val2> : Val2 : Val1;
type MergeError<Err1 extends Marked, Err2 extends Marked> = {
1: IsFalse<Err1>;
2: IsFalse<Err2>;
} extends {
1: true;
2: true;
} ? MergeWMessages<Err1, Err2, false> : {
1: IsFalse<Err1>;
2: IsFalse<Err2>;
} extends {
1: true;
2: false;
} ? MergeWOMessages<Err1, Err2, false> : {
1: IsFalse<Err1>;
2: IsFalse<Err2>;
} extends {
1: false;
2: true;
} ? MergeWOMessages<Err2, Err1, false> : MergeWMessages<Err1, Err2, true>;
export type { AddError, IsError, IsFalse, IsNever, MergeError, MergeVal, Print, PrintFalse, PrintNever };