/
types.ts
46 lines (39 loc) · 955 Bytes
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import type { Readable } from 'svelte/store';
export type FieldOptions = {
valid: boolean;
checkOnInit: boolean;
validateOnChange: boolean;
stopAtFirstError: boolean;
};
export type Field<T> = {
name: string;
value: T;
valid: boolean;
invalid: boolean;
dirty: boolean;
errors: string[];
};
export const defaultFieldOptions: FieldOptions = {
valid: true,
checkOnInit: false,
validateOnChange: true,
stopAtFirstError: false
};
export type FieldsValues<T> = T extends Readable<infer U>
? U
: {
[K in keyof T]: T[K] extends Readable<infer U> ? U : never;
};
export type Fields =
| Readable<any>
| [Readable<any>, ...Array<Readable<any>>]
| Array<Readable<any>>;
export type Form = {
valid: boolean;
dirty: boolean;
errors: string[];
};
export function isField<T>(field: any): field is Field<T> {
const keys = Object.keys(field);
return ['name', 'value', 'valid', 'invalid', 'errors'].every((key) => keys.includes(key));
}