export interface PropOptions { type?: PropType; required?: boolean; default?: T | (() => T | null | undefined) | null | undefined; validator?(value: T): boolean; } export type PropType = PropConstructor | PropConstructor[]; export type PropConstructor = { (): T; } | { new (...parameters: any[]): T & object; }; export type RequiredPropOptions = PropOptions & { required: true; }; export type DefaultPropOptions = PropOptions & { default: unknown; }; export interface PropOptionsGenerator { optional: PropOptions; nullable: DefaultPropOptions; withDefault: (defaultValue: OneOfDefaultType) => DefaultPropOptions; required: RequiredPropOptions; } /** Allow simple values for primitive types, require generator function for complex types */ export type OneOfDefaultType = T extends boolean | number | string | symbol | null | undefined ? T : () => T; export type Constructor = new (...parameters: any[]) => any;