import {IsEqual} from './comparison'; import {PlainObject} from './types'; // Extract keys type __KeyOfValueWithType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TObject[TKey] extends TValue ? TKey : never : never; export type KeyOfValueWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __KeyOfValueWithType : never : __KeyOfValueWithType; type __KeyOfValueNotWithType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TObject[TKey] extends TValue ? never : TKey : never; export type KeyOfValueNotWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __KeyOfValueNotWithType : never : __KeyOfValueNotWithType; export type KeyOfUnionValueNotWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __KeyOfValueNotWithType : never : __KeyOfValueNotWithType; type __KeyOfValueContainingType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TValue extends TObject[TKey] ? TKey : never : never; export type KeyOfValueContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __KeyOfValueContainingType : never : __KeyOfValueContainingType; type __KeyOfValueNotContainingType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TValue extends TObject[TKey] ? never : TKey : never; export type KeyOfValueNotContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __KeyOfValueNotContainingType : never : __KeyOfValueNotContainingType; // Extract values type __ValueWithType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TObject[TKey] extends TValue ? TObject[TKey] : never : never; export type ValueWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __ValueWithType : never : __ValueWithType; type __ValueNotWithType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TObject[TKey] extends TValue ? never : TObject[TKey] : never; export type ValueNotWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __ValueNotWithType : never : __ValueNotWithType; type __ValueContainingType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TValue extends TObject[TKey] ? TObject[TKey] : never : never; export type ValueContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __ValueContainingType : never : __ValueContainingType; type __ValueNotContainingType< TObject extends object, TKey extends keyof TObject, TValue, > = TKey extends keyof TObject ? TValue extends TObject[TKey] ? never : TObject[TKey] : never; export type ValueNotContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? __ValueNotContainingType : never : __ValueNotContainingType; export type ValueOfKey< TObject extends object, TKey extends keyof TObject, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? TKey extends keyof TObject ? TObject[TKey] : never : never : TObject[TKey]; export type ValueNotOfKey< TObject extends object, TKey extends keyof TObject, TDistributeUnion extends boolean = true, > = ValueOfKey, TDistributeUnion>; // Keep or omit values by keys export type KeepValueOfKey< TObject extends object, TKey extends keyof TObject, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? Pick> : never : Pick>; export type OmitValueOfKey< TObject extends object, TKey extends keyof TObject, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? Pick> : never : Pick>; // Keep or omit values with given type export type KeepValueWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? {[K in KeyOfValueWithType]: TObject[K]} : never : {[K in KeyOfValueWithType]: TObject[K]}; export type OmitValueWithType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? {[K in KeyOfValueNotWithType]: TObject[K]} : never : {[K in KeyOfValueNotWithType]: TObject[K]}; export type KeepValueContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? {[K in KeyOfValueContainingType]: TObject[K]} : never : {[K in KeyOfValueContainingType]: TObject[K]}; export type OmitValueContainingType< TObject extends object, TValue, TDistributeUnion extends boolean = true, > = TDistributeUnion extends true ? TObject extends object ? {[K in KeyOfValueNotContainingType]: TObject[K]} : never : {[K in KeyOfValueNotContainingType]: TObject[K]}; // Optionalize values export type OptionalizeUndefined< TObject extends object, TDistributeUnion extends boolean = true, > = Partial> & OmitValueContainingType; export type OptionalizeUndefinedDeep = T extends PlainObject ? PartialByKey< { [K in keyof T]: OptionalizeUndefinedDeep; }, KeyOfValueContainingType > : T; // String export type ReplaceString< T extends string, TSearch extends string, TReplace extends string, > = T extends `${infer TBefore}${TSearch}${infer TAfter}` ? `${ReplaceString}${TReplace}${ReplaceString< TAfter, TSearch, TReplace >}` : T; // Miscellaneous export type Default = IsEqual extends true ? TDefault : T; export type PromiseType> = TPromise extends Promise ? T : never; export type DeepReadonly = {readonly [P in keyof T]: DeepReadonly}; export type Intersection = ( TUnion extends any ? (_: TUnion) => void : never ) extends (_: infer T) => void ? T : never; type __ObjectUnionNonGeneralKey = Exclude< TObjectUnion extends object ? keyof TObjectUnion : never, keyof TObjectUnion >; type __FlattenObject< TObjectUnion extends object, TGeneralKey extends keyof TObjectUnion = keyof TObjectUnion, > = {[TKey in TGeneralKey]: TObjectUnion[TKey]} & { [TKey in __ObjectUnionNonGeneralKey]?: TObjectUnion extends object ? TKey extends keyof TObjectUnion ? TObjectUnion[TKey] : never : never; }; export type Flatten = | __FlattenObject> | Exclude; export type PartialByKey< TObject extends object, TKey extends keyof TObject, > = Omit & Partial>; export type DeepPartial = {[P in keyof T]?: DeepPartial};