interface.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* eslint-disable @typescript-eslint/ban-types */
  2. import { DefaultAdapter } from '../base/foundation';
  3. import { Options as ScrollIntoViewOptions } from 'scroll-into-view-if-needed';
  4. export type BasicTriggerType = 'blur' | 'change' | 'custom' | 'mount';
  5. export type FieldValidateTriggerType = BasicTriggerType | Array<BasicTriggerType>;
  6. export type CommonFieldError = boolean | string | Array<any> | undefined | unknown;
  7. export type BasicFieldError = Array<any>;
  8. export interface BaseFormAdapter<P = Record<string, any>, S = Record<string, any>, Values extends object = any> extends DefaultAdapter<P, S> {
  9. cloneDeep: (val: any, ...rest: any[]) => any;
  10. notifySubmit: (values: any, e?: any) => void;
  11. notifySubmitFail: (errors: Record<keyof Values, BasicFieldError>, values: Partial<Values>, e?: any) => void;
  12. forceUpdate: (callback?: () => void) => void;
  13. notifyChange: (formState: FormState) => void;
  14. notifyValueChange: (values: any, changedValues: any) => void;
  15. notifyErrorChange: (errors: any, changedError: any) => void;
  16. notifyReset: () => void;
  17. getInitValues: () => Partial<Values>;
  18. getFormProps: (keys: undefined | string | Array<string>) => any;
  19. getAllErrorDOM: () => NodeList;
  20. getFieldDOM: (field: string) => Node;
  21. getFieldErrorDOM: (field: string) => Node;
  22. initFormId: () => void
  23. }
  24. export type AllErrors<T> = T extends Record<string, any> ? { [K in keyof T]?: string } : Record<string, any>;
  25. export interface FormState<T extends Record<string, any> = any> {
  26. values?: T extends Record<string, any> ? T : Record<string, any>;
  27. errors?: AllErrors<T>;
  28. touched?: T extends Record<string, any> ? { [K in keyof T]?: boolean } : Record<string, any>
  29. }
  30. export interface setValuesConfig {
  31. isOverride: boolean
  32. }
  33. // FieldPath 类型定义,用于生成对象字段的路径字符串
  34. export type FieldPath<T> = T extends object ? {
  35. // 遍历对象的每个键 K
  36. [K in keyof T]: T[K] extends object
  37. // 如果键 K 对应的值是对象,则生成嵌套路径(递归调用 FieldPath)
  38. ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}`
  39. // 否则,仅生成当前键的路径
  40. : `${string & K}`;
  41. }[keyof T]
  42. : never;
  43. // FieldPathValue 类型定义,用于从路径字符串中推导出实际的类型
  44. export type FieldPathValue<T, P extends FieldPath<T>> =
  45. // 如果路径字符串 P 包含嵌套路径(使用模板字符串类型进行匹配)
  46. P extends `${infer K}.${infer Rest}`
  47. ? K extends keyof T
  48. // 递归解析嵌套路径,逐层深入对象结构
  49. ? Rest extends FieldPath<T[K]>
  50. ? FieldPathValue<T[K], Rest>
  51. : never
  52. : never
  53. // 如果路径字符串 P 是顶层键
  54. : P extends keyof T
  55. ? T[P]
  56. : never;
  57. export type ScrollToErrorOptions<K> = {
  58. field?: K;
  59. index?: number;
  60. scrollOpts?: ScrollIntoViewOptions
  61. }
  62. // use object replace Record<string, any>, fix issue 933
  63. export interface BaseFormApi<T extends object = any> {
  64. /** get value of field */
  65. getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
  66. /** set value of field */
  67. setValue: <K extends FieldPath<T>>(field: K, newFieldValue: any) => void;
  68. /** get error of field */
  69. getError: <K extends keyof T>(field: K) => any;
  70. /** set error of field */
  71. setError: <K extends keyof T>(field: K, fieldError: any) => void;
  72. /** get touched of field */
  73. getTouched: <K extends keyof T>(field: K) => boolean;
  74. /** set touch of field */
  75. setTouched: <K extends keyof T>(field: K, fieldTouch: boolean) => void;
  76. /** judge field exist */
  77. getFieldExist: <K extends keyof T>(field: K) => boolean;
  78. /** get formState of form */
  79. getFormState: () => FormState<T extends object ? T : object>;
  80. /** get formProps of form */
  81. getFormProps: (keys?: Array<string>) => ComponentProps;
  82. /** submit form manual */
  83. submitForm: () => void;
  84. /** reset form manual */
  85. reset: (fields?: Array<string>) => void;
  86. /** trigger validate manual */
  87. validate: <K extends keyof T, Params extends Array<K>, V extends Params[number]>(fields?: Params) => Promise<{ [R in V]: T[R] }>;
  88. getInitValue: <K extends keyof T>(field: K) => any;
  89. getInitValues: () => any;
  90. getValues: () => T;
  91. /** set value of multiple fields */
  92. setValues: (fieldsValue: Partial<T>, config?: setValuesConfig) => void;
  93. scrollToField: <K extends keyof T>(field: K, scrollConfig?: ScrollIntoViewOptions) => void;
  94. scrollToError: <K extends keyof T>(config?: ScrollToErrorOptions<K>) => void
  95. }
  96. export interface CallOpts {
  97. [x: string]: any;
  98. notNotify?: boolean;
  99. notUpdate?: boolean;
  100. needClone?: boolean
  101. }
  102. export interface ComponentProps {
  103. [x: string]: any
  104. }
  105. export interface FieldState {
  106. value?: any;
  107. touched?: any;
  108. error?: any;
  109. status?: 'error' | 'success'
  110. }
  111. export interface WithFieldOption {
  112. valueKey?: string;
  113. onKeyChangeFnName?: string;
  114. valuePath?: string;
  115. maintainCursor?: boolean;
  116. shouldMemo?: boolean;
  117. shouldInject?: boolean
  118. }
  119. export interface InternalFieldApi {
  120. setValue: (val: any, opts: CallOpts) => void;
  121. setTouched: (isTouched: boolean, opts: CallOpts) => void;
  122. setError: (errors: any, opts: CallOpts) => void;
  123. reset: () => void;
  124. validate: (val: any, opts: CallOpts) => Promise<unknown>
  125. }
  126. export interface FieldStaff {
  127. field: string;
  128. fieldApi: InternalFieldApi;
  129. keepState: boolean;
  130. allowEmpty: boolean
  131. }
  132. export interface ArrayFieldStaff {
  133. field: string;
  134. updateKey?: string;
  135. initValue?: any
  136. }
  137. export interface FormUpdaterContextType {
  138. register: (field: string, fieldState: FieldState, fieldStuff: FieldStaff) => void;
  139. unRegister: (field: string) => void;
  140. updateStateValue: (field: string, value: any, opts?: CallOpts) => void;
  141. updateStateError: (field: string, error: any, opts?: CallOpts) => void;
  142. updateStateTouched: (field: string, isTouched: boolean, opts?: CallOpts) => void;
  143. getValue: (field?: string | undefined, opts?: CallOpts) => any;
  144. getError: (field?: string) => any;
  145. getTouched: (field?: string) => boolean | Record<string, any> | undefined;
  146. getInitValues: () => any;
  147. getInitValue: (field?: string) => any;
  148. getFormProps: (keys?: Array<string>) => ComponentProps;
  149. getField: (field: string) => FieldStaff | undefined;
  150. registerArrayField: (arrayFieldPath: string, val: any) => void;
  151. unRegisterArrayField: (arrayField: string) => void;
  152. getArrayField: (arrayField: string) => ArrayFieldStaff;
  153. updateArrayField: (arrayField: string, updateValue: any) => void
  154. }