/** Create a deep version of another object type where property values are recursively replaced into a given value type. Use-cases: - Form validation: Define how each field should be validated. - Form settings: Define configuration for input fields. - Parsing: Define types that specify special behavior for specific fields. @example ``` import type {Schema} from 'type-fest'; interface User { id: string; name: { firstname: string; lastname: string; }; created: Date; active: boolean; passwordHash: string; } type UserMask = Schema; const userMaskSettings: UserMask = { id: 'show', name: { firstname: 'show', lastname: 'mask', }, phoneNumbers: 'mask', created: 'show', active: 'show', passwordHash: 'hide', } ``` @category Object */ export type Schema = ObjectType extends string ? ValueType : ObjectType extends Map ? ValueType : ObjectType extends Set ? ValueType : ObjectType extends ReadonlyMap ? ValueType : ObjectType extends ReadonlySet ? ValueType : ObjectType extends readonly unknown[] ? ValueType : ObjectType extends unknown[] ? ValueType : ObjectType extends (...arguments: unknown[]) => unknown ? ValueType : ObjectType extends Date ? ValueType : ObjectType extends Function ? ValueType : ObjectType extends RegExp ? ValueType : ObjectType extends object ? SchemaObject : ValueType; /** Same as `Schema`, but accepts only `object`s as inputs. Internal helper for `Schema`. */ type SchemaObject = { [KeyType in keyof ObjectType]: Schema | K; };