typed-well
Version:
A unit testing library for your TypeScript definitions.
66 lines (65 loc) • 4.34 kB
TypeScript
export declare namespace $ {
export type falsy = false | "" | 0 | 0n | null | undefined | void;
export type primitive = string | number | bigint | boolean | symbol | null | undefined;
export type nullish = null | undefined | void;
export type assert<condition extends true> = never;
export type assertNever<condition extends never> = never;
export type assertNot<condition extends false> = never;
export type assertResolves<A, B extends A> = never;
export type not<A extends boolean> = [A] extends [true] ? false : true;
export type isNot<A, B> = not<isAssignable<A, B>>;
export type equals<A, B> = [A, B] extends [B, A] ? true : false;
export type notEquals<A, B> = not<equals<A, B>>;
export type ifThen<predicate extends boolean, //
result, alternative = never> = ifElse<predicate, result, alternative>;
export type ifElse<predicate extends boolean, //
result, alternative> = isNotNever<predicate> extends true ? [predicate] extends [true] ? result : alternative : alternative;
export type and<A extends boolean, //
B extends boolean> = ifThen<A, ifThen<B, true, false>, false>;
export type or<A extends boolean, //
B extends boolean> = ifThen<A, true, ifThen<B, true, false>>;
export type xor<A extends boolean, //
B extends boolean> = notEquals<A, B>;
export type butNot<A extends boolean, //
B extends boolean> = and<A, not<B>>;
export type isUndefined<T> = or<equals<undefined, T>, equals<void, T>>;
export type isOptional<T> = isAssignable<undefined, T>;
export type isDefined<T> = and<not<isOptional<T>>, isNotNever<T>>;
export type isPrimitive<T> = isAssignable<T, primitive>;
export type isLiteral<T> = not<isAssignable<doesExtend<T, number> | doesExtend<T, string> | doesExtend<T, boolean>, false>>;
export type isFalsy<T> = isAssignable<T, falsy>;
export type isTruthy<T, //
notFalsy = not<isAnyAssignable<falsy, T>>> = [T] extends [{}] ? ([{}] extends [T] ? true : notFalsy) : notFalsy;
export type isNever<T> = equals<T, never>;
export type isNotNever<T> = not<equals<T, never>>;
export type isAssignable<A, toB> = [A] extends [toB] ? true : false;
export type isAnyAssignable<A, B> = not<equals<A extends B ? true : false, false>>;
export type isEveryAssignable<A, B> = equals<A extends B ? true : false, true>;
export type isInvokable<T> = or<isAssignable<T, {
(...args: any[]): any;
}>, isAssignable<T, Function>>;
export type isNewable<T> = isAssignable<T, {
new (...args: any[]): any;
}>;
export type doesExtend<A, B> = butNot<isAssignable<A, B>, isAssignable<B, A>>;
export type doesSubset<A, B> = butNot<isAssignable<A, B>, isAssignable<B, A>>;
export type doesSuperset<A, B> = butNot<isAssignable<B, A>, isAssignable<A, B>>;
export type isPrefixed<T, //
P> = [T] extends [string] ? [P] extends [string] ? [T] extends [`${P}${infer _}`] ? true : false : false : false;
export type isSuffixed<T, //
P> = [T] extends [string] ? [P] extends [string] ? [T] extends [`${infer _}${P}`] ? true : false : false : false;
export type doesContain<T, //
S> = [T] extends [string] ? [S] extends [string] ? [T] extends [`${infer _}${S}${infer __}`] ? true : false : false : false;
export type hasKeys<O, K> = [K] extends [string] ? isAssignable<K, keyof O> : false;
export type hasOnlyKeys<O, K> = [K] extends [string] ? equals<O, Record<K, any>> : false;
export type hasValues<O, V> = isAssignable<V, O[keyof O]>;
export type hasOnlyValues<O, V> = equals<V, O[keyof O]>;
export type includes<T, V> = [T] extends [Array<any>] ? [V] extends [T[number]] ? true : false : false;
export type returns<T, V> = [T] extends [(...args: any) => infer R] ? isAssignable<V, R> : false;
export type returnsOnly<T, V> = [T] extends [(...args: any) => infer R] ? equals<R, V> : false;
export type resolvesTo<T, V> = returns<T, Promise<V>>;
export type resolvesOnlyTo<T, V> = returnsOnly<T, Promise<V>>;
export type acceptsParameters<T, V> = [V] extends [any[]] ? [T] extends [(...args: infer A) => any] ? isAssignable<V, A> : false : false;
export type acceptsOnlyParameters<T, V> = [V] extends [any[]] ? [T] extends [(...args: infer A) => any] ? equals<V, A> : false : false;
export {};
}