export type Primitive = string | number | symbol export type WrapKey< TKey, TPrefix extends string = '', TSuffix extends string = '', > = TKey extends string ? `${TPrefix}${TKey}${TSuffix}` : never export type UnwrapKey< TWrappedKey, TPrefix extends string = '', TSuffix extends string = '', > = TWrappedKey extends WrapKey ? TKey : '' export type WrappedValue< TObject extends object, TWrappedKey extends string, TPrefix extends string = '', TSuffix extends string = '', > = TObject extends { [K in UnwrapKey]: infer TValue } ? TValue : never export type PrefixObjectKeys< TObject extends object, TPrefix extends string, > = { [K in WrapKey]: WrappedValue } export type SuffixObjectKeys< TObject extends object, TSuffix extends string, > = { [K in WrapKey]: WrappedValue } export type WrapObjectKeys< TObject extends object, TPrefix extends string, TSuffix extends string, > = { [K in WrapKey]: WrappedValue } export type NestedKeyOf = { [Key in keyof TObject & (string | number)]: TObject[Key] extends object | string ? `${Key}` | `${Key}.${NestedKeyOf}` : `${Key}` }[keyof TObject & (string | number)] export type FilterStartingWith = Set extends `${Needle}${infer _X}` ? Set : never export type WrapUnion< TObject extends Primitive, TPrefix extends string, TSuffix extends string, > = keyof { [K in WrapKey]: any } export type FilterPaths = T extends `${infer R}.${U}` ? R : never