type AnySchema = NullSchema | BooleanSchema | NullableBooleanSchema | NumberSchema | NullableNumberSchema | StringSchema | NullableStringSchema | AnyEnumSchema | AnyArraySchema | AnyNullableArraySchema | AnyObjectSchema | AnyNullableObjectSchema | AnyAllOptionalObjectSchema | AnyNullableAllOptionalObjectSchema | AnyOneOfSchema type StringKeys = (keyof T) & string interface NullSchema { type: 'null' } interface BooleanSchema { type: 'boolean' } interface NullableBooleanSchema { type: ('boolean' | 'null')[] } interface NumberSchema { type: 'number' } interface NullableNumberSchema { type: ('number' | 'null')[] } interface StringSchema { type: 'string' } interface NullableStringSchema { type: ('string' | 'null')[] } interface AnyEnumSchema extends EnumSchema {} interface EnumSchema { enum: Enum[] } interface AnyArraySchema extends ArraySchema {} interface ArraySchema { type: 'array', items: ItemSchema } interface AnyNullableArraySchema extends NullableArraySchema {} interface NullableArraySchema { type: ('array' | 'null')[], items: ItemSchema } interface AnyObjectSchema extends ObjectSchema, string> {} interface ObjectSchema, Required extends StringKeys> { additionalProperties?: boolean type: 'object' properties: Properties required: Required[] } interface AnyNullableObjectSchema extends NullableObjectSchema, string> {} interface NullableObjectSchema, Required extends StringKeys> { additionalProperties?: boolean type: ('object' | 'null')[] properties: Properties required: Required[] } interface AnyAllOptionalObjectSchema extends AllOptionalObjectSchema> {} interface AllOptionalObjectSchema> { additionalProperties?: boolean type: 'object' properties: Properties } interface AnyNullableAllOptionalObjectSchema extends NullableAllOptionalObjectSchema> {} interface NullableAllOptionalObjectSchema> { additionalProperties?: boolean type: ('object' | 'null')[] properties: Properties } interface AnyOneOfSchema { oneOf: AnySchema[] } interface ArrayFromSchema extends Array> {} type ObjectFromSchema, Required extends StringKeys> = { [Key in keyof Properties]: (Key extends Required ? TypeFromSchema : TypeFromSchema | undefined) } type TypeFromSchema = ( Schema extends EnumSchema ? Enum : Schema extends NullSchema ? null : Schema extends BooleanSchema ? boolean : Schema extends NullableBooleanSchema ? (boolean | null) : Schema extends NumberSchema ? number : Schema extends NullableNumberSchema ? (number | null) : Schema extends StringSchema ? string : Schema extends NullableStringSchema ? (string | null) : Schema extends ArraySchema ? ArrayFromSchema : Schema extends NullableArraySchema ? (ArrayFromSchema | null) : Schema extends ObjectSchema ? ObjectFromSchema : Schema extends NullableObjectSchema ? (ObjectFromSchema | null) : Schema extends AllOptionalObjectSchema ? ObjectFromSchema : Schema extends NullableAllOptionalObjectSchema ? (ObjectFromSchema | null) : never ) declare namespace factory { interface ValidationError { field: string message: string value: unknown type: string } } interface Validator> { (input: unknown, options?: any): input is Output errors: factory.ValidationError[] toJSON(): Schema } interface Filter> { (input: Output, options?: any): Output } interface Factory { /* One of object schema */ , Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema] }, options?: any): Validator<{ oneOf: [ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema> createFilter, Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema] }, options?: any): Filter<{ oneOf: [ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema> , Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys, Properties3 extends Record, Required3 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema, ObjectSchema] }, options?: any): Validator<{ oneOf: [ObjectSchema, ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema | ObjectFromSchema> createFilter, Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys, Properties3 extends Record, Required3 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema, ObjectSchema] }, options?: any): Filter<{ oneOf: [ObjectSchema, ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema | ObjectFromSchema> , Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys, Properties3 extends Record, Required3 extends StringKeys, Properties4 extends Record, Required4 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema, ObjectSchema, ObjectSchema] }, options?: any): Validator<{ oneOf: [ObjectSchema, ObjectSchema, ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema | ObjectFromSchema | ObjectFromSchema> createFilter, Required1 extends StringKeys, Properties2 extends Record, Required2 extends StringKeys, Properties3 extends Record, Required3 extends StringKeys, Properties4 extends Record, Required4 extends StringKeys> (schema: { oneOf: [ObjectSchema, ObjectSchema, ObjectSchema, ObjectSchema] }, options?: any): Filter<{ oneOf: [ObjectSchema, ObjectSchema, ObjectSchema, ObjectSchema] }, ObjectFromSchema | ObjectFromSchema | ObjectFromSchema | ObjectFromSchema> /* One of plain schema */ (schema: { oneOf: [Schema1, Schema2] }, options?: any): Validator<{ oneOf: [Schema1, Schema2] }, TypeFromSchema | TypeFromSchema> createFilter (schema: { oneOf: [Schema1, Schema2] }, options?: any): Filter<{ oneOf: [Schema1, Schema2] }, TypeFromSchema | TypeFromSchema> (schema: { oneOf: [Schema1, Schema2, Schema3] }, options?: any): Validator<{ oneOf: [Schema1, Schema2, Schema3] }, TypeFromSchema | TypeFromSchema | TypeFromSchema> createFilter (schema: { oneOf: [Schema1, Schema2, Schema3] }, options?: any): Filter<{ oneOf: [Schema1, Schema2, Schema3] }, TypeFromSchema | TypeFromSchema | TypeFromSchema> (schema: { oneOf: [Schema1, Schema2, Schema3, Schema4] }, options?: any): Validator<{ oneOf: [Schema1, Schema2, Schema3, Schema4] }, TypeFromSchema | TypeFromSchema | TypeFromSchema | TypeFromSchema> createFilter (schema: { oneOf: [Schema1, Schema2, Schema3, Schema4] }, options?: any): Filter<{ oneOf: [Schema1, Schema2, Schema3, Schema4] }, TypeFromSchema | TypeFromSchema | TypeFromSchema | TypeFromSchema> /* Object schema */ , Required extends StringKeys> (schema: ObjectSchema, options?: any): Validator> createFilter, Required extends StringKeys> (schema: ObjectSchema, options?: any): Filter> /* Plain schema */ (schema: Schema, options?: any): Validator createFilter (schema: Schema, options?: any): Filter } declare const factory: Factory export = factory