///
import { type ReadonlySignal } from "@preact-signals/unified-signals";
import type { ReactiveRef } from "../$";
import type { Accessor } from "../utils";
declare const typeThrow: unique symbol;
type ReactifyPropsInitial> = {
[TKey in keyof T as TKey extends string | number ? TKey : TKey]?: T[TKey] extends ReactiveRef | ReadonlySignal ? ReactiveRef | ReadonlySignal : T[TKey];
} & {
[TKey in keyof T as TKey extends string | number ? `${TKey}$` : TKey]?: Accessor;
};
type Error = {
[typeThrow]: Reason;
};
type TypecheckProps, TInitial extends Record> = {
[TKey in keyof TInitial]: TKey extends string | number ? TKey extends keyof T ? `${TKey}$` extends keyof T ? Error<`You can define only key with $ postfix and key without postfix, but not both: "${TKey}"`> : T[TKey] extends ReactiveRef ? never : T[TKey] extends ReadonlySignal ? never : T[TKey] extends TInitial[TKey] ? never : Error<`Type of "${TKey}" is not assignable to type property type`> : `${TKey}$` extends keyof T ? T[TKey] extends Accessor ? never : Error<`You can define only key with $ postfix and key without postfix, but not both: "${TKey}"`> : never : never;
}[keyof TInitial];
export type ReactifyComponentReturn, TInitial extends Record, TTypecheck extends TypecheckProps = TypecheckProps> = keyof TInitial extends `${string}$` ? {
"reactify.reactive-props.error": "you cannot use a key that ends with $";
} : (args: ReactifyPropsInitial) => TTypecheck extends never ? JSX.Element : {
"reactify.reactive-props.error": TTypecheck[typeof typeThrow];
};
/**
* @description you can pass as prop: Uncached, ReadonlySignal or state.
* But you should never change type of this prop
* TODO: throw in dev mode
*/
export declare const reactify: , TProps>(component: T) => React.ComponentType;
export {};