1
- export type Field = 'string' | 'number' | 'boolean' | 'object' | 'array'
1
+ export type PrimitiveField = 'string' | 'number' | 'boolean'
2
+
3
+ // Schema field definitions for nested structures
4
+ export interface ArrayFieldSchema < T = any > {
5
+ type : 'array'
6
+ items : SchemaField
7
+ required ?: boolean
8
+ default ?: T [ ] | ( ( ) => T [ ] )
9
+ }
10
+
11
+ export interface ObjectFieldSchema < T = any > {
12
+ type : 'object'
13
+ props : { [ K in keyof T ] : SchemaField }
14
+ required ?: boolean
15
+ default ?: T | ( ( ) => T )
16
+ }
17
+
18
+ export interface PrimitiveFieldSchema < T extends PrimitiveField > {
19
+ type : T
20
+ required ?: boolean
21
+ default ?: TypeMap [ T ] | ( ( ) => TypeMap [ T ] )
22
+ primaryKey ?: boolean
23
+ autoIncrement ?: boolean
24
+ }
25
+
26
+ export type SchemaField =
27
+ | PrimitiveFieldSchema < PrimitiveField >
28
+ | ArrayFieldSchema
29
+ | ObjectFieldSchema
2
30
3
31
export interface TypeMap {
4
32
string : string
5
33
number : number
6
34
boolean : boolean
7
- object : object
8
- array : any [ ]
9
35
}
10
36
11
- export type SchemaField = {
12
- [ T in Field ] : {
13
- type : T
14
- required ?: boolean
15
- default ?: TypeMap [ T ] | ( ( ) => TypeMap [ T ] )
16
- primaryKey ?: boolean
17
- autoIncrement ?: boolean
18
- }
19
- } [ Field ]
37
+ // Helper type to infer the actual TypeScript type from a schema field
38
+ export type InferField < T extends SchemaField > = T extends PrimitiveFieldSchema < infer P >
39
+ ? TypeMap [ P ]
40
+ : T extends ArrayFieldSchema
41
+ ? InferField < T [ 'items' ] > [ ]
42
+ : T extends ObjectFieldSchema
43
+ ? { [ K in keyof T [ 'props' ] ] : InferField < T [ 'props' ] [ K ] > }
44
+ : never
20
45
21
46
export interface TableSchema {
22
47
[ key : string ] : SchemaField
23
48
}
24
49
50
+ export type InferSchemaType < T extends TableSchema > = {
51
+ [ K in keyof T as T [ K ] extends { primaryKey : true }
52
+ ? K
53
+ : T [ K ] extends { required : true } | { default : any }
54
+ ? K
55
+ : never ] : InferField < T [ K ] >
56
+ } & {
57
+ [ K in keyof T as T [ K ] extends { primaryKey : true }
58
+ ? never
59
+ : T [ K ] extends { required : true } | { default : any }
60
+ ? never
61
+ : K ] ?: InferField < T [ K ] >
62
+ }
63
+
25
64
export type PrimaryKeyField < T extends TableSchema > = {
26
65
[ K in keyof T ] : T [ K ] extends { primaryKey : true } ? K : never
27
66
} [ keyof T ]
@@ -47,30 +86,18 @@ export interface FilterCondition {
47
86
value : any
48
87
}
49
88
50
- export type InferValue < T extends SchemaField > = TypeMap [ T [ 'type' ] ]
89
+ export type InferValue < T extends SchemaField > = T extends PrimitiveFieldSchema < infer P >
90
+ ? TypeMap [ P ]
91
+ : T extends ArrayFieldSchema
92
+ ? InferField < T [ 'items' ] > [ ]
93
+ : T extends ObjectFieldSchema
94
+ ? { [ K in keyof T [ 'props' ] ] : InferField < T [ 'props' ] [ K ] > }
95
+ : never
51
96
52
97
export type FieldType < T extends TableSchema , K extends keyof T > = InferValue < T [ K ] >
53
98
54
- export type InferSchemaType < T extends TableSchema > = {
55
- [ K in keyof T as T [ K ] extends { primaryKey : true }
56
- ? K
57
- : T [ K ] extends { required : true } | { default : any }
58
- ? K
59
- : never ] : InferValue < T [ K ] >
60
- } & {
61
- [ K in keyof T as T [ K ] extends { primaryKey : true }
62
- ? never
63
- : T [ K ] extends { required : true } | { default : any }
64
- ? never
65
- : K ] ?: InferValue < T [ K ] >
66
- }
67
-
68
99
type HasDefault < T extends SchemaField > = T extends { default : any } ? true : false
69
100
70
- // type DefaultKeys<T extends TableSchema> = {
71
- // [K in keyof T]: HasDefault<T[K]> extends true ? K : never
72
- // }[keyof T]
73
-
74
101
type RequiredKeys < T extends TableSchema > = {
75
102
[ K in keyof T ] : T [ K ] extends { required : true }
76
103
? HasDefault < T [ K ] > extends true ? never : K
0 commit comments