import { Struct, StructType, StructContext } from './struct';
import { ObjectSchema, InferObjectStruct, Assign } from './xtras';
/**
* Create a new struct that combines the properties properties from multiple
* object structs.
*
* Like JavaScript's `Object.assign` utility.
*/
export declare function assign(Structs: [InferObjectStruct, InferObjectStruct]): InferObjectStruct>;
export declare function assign(Structs: [InferObjectStruct, InferObjectStruct, InferObjectStruct]): InferObjectStruct, C>>;
export declare function assign(Structs: [InferObjectStruct, InferObjectStruct, InferObjectStruct, InferObjectStruct]): InferObjectStruct, C>, D>>;
export declare function assign(Structs: [InferObjectStruct, InferObjectStruct, InferObjectStruct, InferObjectStruct, InferObjectStruct]): InferObjectStruct, C>, D>, E>>;
/**
* Create a struct with dynamic, runtime validation.
*
* The callback will receive the value currently being validated, and must
* return a struct object to validate it with. This can be useful to model
* validation logic that changes based on its input.
*/
export declare function dynamic(fn: (value: unknown, ctx: StructContext) => Struct): Struct;
/**
* Create a struct with lazily evaluated validation.
*
* The first time validation is run with the struct, the callback will be called
* and must return a struct object to use. This is useful for cases where you
* want to have self-referential structs for nested data structures to avoid a
* circular definition problem.
*/
export declare function lazy(fn: () => Struct): Struct;
/**
* Create a new struct based on an existing object struct, but excluding
* specific properties.
*
* Like TypeScript's `Omit` utility.
*/
export declare function omit(struct: InferObjectStruct, keys: K[]): InferObjectStruct>;
/**
* Create a new struct based on an existing object struct, but with all of its
* properties allowed to be `undefined`.
*
* Like TypeScript's `Partial` utility.
*/
export declare function partial(struct: InferObjectStruct | S): InferObjectStruct<{
[K in keyof S]: Struct | undefined>;
}>;
/**
* Create a new struct based on an existing object struct, but only including
* specific properties.
*
* Like TypeScript's `Pick` utility.
*/
export declare function pick(struct: InferObjectStruct, keys: K[]): InferObjectStruct>;
/**
* Create a new struct with a custom validation function.
*/
export declare function struct(name: string, validator: Struct['validator']): Struct;