# Shared 类型集
# Function
export type Function<T, R> = (arg: T) => R;
# BiFunction
export type BiFunction<T extends Array<unknown>, R> = (...arg: T) => R;
# Supplier
export type Supplier<R> = () => R;
# Runnable
export type Runnable = () => void;
# Consumer
export type Consumer<T> = (arg: T) => void;
# BiConsumer
export type BiConsumer<T extends Array<unknown>> = (...arg: T) => void;
# StorageModuleSchema
type StorageModuleSchema = Record<string, unknown>;
# ResetterKey
type ResetterKey<T> = PrefixedKey<T, 'reset'>;
# CheckerKey
type CheckerKey<T> = PrefixedKey<T, 'contains'>;
# Resetter
type Resetter = () => void;
# Checker
type Checker = () => boolean;
# PrefixedKey
type PrefixedKey<T, Prefix extends string> = T extends string ? `${Prefix}${Capitalize<T>}` : never;
# SuffixedKey
type SuffixedKey<T, Suffix extends string> = T extends string ? `${T}${Capitalize<Suffix>}` : never;
# RestorePrefixedKey
type RestorePrefixedKey<T, Prefix extends string> = T extends `${Prefix}${infer U}` ? Uncapitalize<U> : never;
# RestoreSuffixedKey
type RestoreSuffixedKey<T, Suffix extends string> = T extends `${infer U}${Capitalize<Suffix>}` ? U : never;
# PrefixedKeys
type PrefixedKeys<T, Prefix extends string> = PrefixedKey<keyof T, Prefix>;
# SuffixedKeys
type SuffixedKeys<T, Suffix extends string> = SuffixedKey<keyof T, Suffix>;
# IsOptional
type IsOptional<T extends object, K extends keyof T> = {
[K1 in Exclude<keyof T, K>]: T[K1];
} & { K?: T[K] } extends T
? K
: never;
# OptionalKeys
type OptionalKeys<T extends object> = {
[K in keyof T]-?: IsOptional<T, K>;
}[keyof T];
# PickNonNullable
type PickNonNullable<T extends object> = Omit<T, OptionalKeys<T>>;