export type TypeCopyFunction = (src: T, dest: T) => T; export type TypeCloneFunction = (value: T) => T; export interface PropTypeDefinition { name: string default: D copy: TypeCopyFunction clone: TypeCloneFunction } export interface PropType extends PropTypeDefinition { isType: true } export type NumberPropType = PropType; export type BooleanPropType = PropType; export type StringPropType = PropType; export type ArrayPropType = PropType, []>; export type RefPropType = PropType; export type JSONPropType = PropType; export const Types: { Number: NumberPropType, Boolean: BooleanPropType, String: StringPropType, Array: ArrayPropType, Ref: RefPropType, JSON: JSONPropType }; export function copyValue(src: T, dest: T): T; export function cloneValue(value: T): T; export function copyArray(src: T, dest: T): Array; export function cloneArray(value: Array): Array; export function copyJSON(src: any, dest: any): any; export function cloneJSON(value: any): any; export function copyCopyable(src: T, dest: T): T; export function cloneClonable(value: T): T; /** * Use createType to create custom type definitions. * @param typeDefinition An object with create, reset and clear functions for the custom type. */ export function createType(typeDefinition: PropTypeDefinition): PropType