Skip to content

Commit 72d1e9c

Browse files
committed
Explicit types for SchemaTypes
1 parent ac2eb60 commit 72d1e9c

File tree

1 file changed

+73
-34
lines changed

1 file changed

+73
-34
lines changed

index.d.ts

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,103 @@
11
import * as React from 'react'
22

33
type IsRequiredOption = {
4-
required: boolean,
4+
required?: boolean,
55
}
66

7-
// TODO: all of the schema types can be enumerated
8-
type FunctionSchemaType <TOptions> = ((x: unknown) => boolean)
7+
type BaseSchemaType<TOptions> = ((x: unknown) => boolean)
98
& { _isSchemaType: true, _type: string, } & TOptions
9+
type SchemaTypeFactory<TOptions> = (options?: TOptions) => BaseSchemaType<TOptions>
10+
11+
type StringSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
12+
type StringSchemaType = BaseSchemaType<IsRequiredOption>
13+
14+
type BooleanSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
15+
type BooleanSchemaType = BaseSchemaType<IsRequiredOption>
16+
17+
type NumberSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
18+
type NumberSchemaType = BaseSchemaType<IsRequiredOption>
19+
20+
type FunctionSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
21+
type FunctionSchemaType = BaseSchemaType<IsRequiredOption>
22+
23+
type DateSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
24+
type DateSchemaType = BaseSchemaType<IsRequiredOption>
25+
26+
type ArraySchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
27+
type ArraySchemaType = BaseSchemaType<IsRequiredOption>
28+
29+
type AnyObjectSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
30+
type AnyObjectSchemaType = BaseSchemaType<IsRequiredOption>
31+
32+
type ArrayOfSchemaTypeFactory = (type: SchemaType) => SchemaTypeFactory<IsRequiredOption>
33+
type ArrayOfSchemaType = BaseSchemaType<IsRequiredOption>
34+
35+
type AnySchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
36+
type AnySchemaType = BaseSchemaType<IsRequiredOption>
37+
1038
interface ObjectSchemaType {
11-
// TODO: avoid hardcoded option type
12-
[key: string]: FunctionSchemaType<IsRequiredOption> | ObjectSchemaType,
39+
[key: string]: SchemaType,
1340
}
14-
type SchemaType = FunctionSchemaType<IsRequiredOption> | ObjectSchemaType
15-
type SchemaTypeFactory = (options?: IsRequiredOption) => SchemaType
41+
42+
type SchemaType =
43+
StringSchemaType
44+
| BooleanSchemaType
45+
| NumberSchemaType
46+
| FunctionSchemaType
47+
| DateSchemaType
48+
| ArraySchemaType
49+
| AnyObjectSchemaType
50+
| ArrayOfSchemaType
51+
| AnySchemaType
52+
| ObjectSchemaType
1653

1754
export const SchemaTypes: {
18-
any: SchemaTypeFactory,
19-
string: SchemaTypeFactory,
20-
boolean: SchemaTypeFactory,
21-
function: SchemaTypeFactory,
22-
number: SchemaTypeFactory,
23-
date: SchemaTypeFactory,
24-
array: SchemaTypeFactory,
25-
object: SchemaTypeFactory,
26-
arrayOf: (type: SchemaType) => SchemaTypeFactory,
27-
};
55+
any: AnySchemaTypeFactory,
56+
string: StringSchemaTypeFactory,
57+
boolean: BooleanSchemaTypeFactory,
58+
function: FunctionSchemaTypeFactory,
59+
number: NumberSchemaTypeFactory,
60+
date: DateSchemaTypeFactory,
61+
array: ArraySchemaTypeFactory,
62+
object: AnyObjectSchemaTypeFactory,
63+
arrayOf: ArrayOfSchemaTypeFactory,
64+
}
2865

2966
export const matchesSchema: (schema: SchemaType, test: unknown) => boolean
3067

3168
type BaseEditorProps = {
32-
// TODO: this is wrong. The set of valid schematypes and options should be predefined
3369
type: SchemaType,
3470
className?: string,
3571
}
3672

3773
type EditablePrimitive = number | string | boolean
74+
3875
interface EditableObject {
3976
[key: string]: Editable,
4077
}
78+
4179
interface EditableArray {
4280
[key: number]: Editable,
4381
}
82+
4483
type Editable = EditablePrimitive | EditableObject | EditableArray
4584

46-
export class ObjectEditor <TObject extends Editable> extends
47-
React.Component<BaseEditorProps & {
48-
object?: TObject,
49-
onUpdateElement: (object: TObject) => void,
50-
parentVisible?: boolean,
51-
}> {}
52-
53-
export class ArrayEditor <TObject extends Editable> extends
54-
React.Component<BaseEditorProps & {
55-
object?: Array<TObject>,
56-
onUpdateElement: (object: TObject, index: number) => void,
57-
onRemoveElements: (indices: Array<Number>) => void,
58-
onAddElement: (object: TObject) => void,
59-
parentVisible?: boolean,
60-
defaultRowsPerPage?: number,
61-
}> {}
85+
export class ObjectEditor<TObject extends Editable> extends React.Component<BaseEditorProps & {
86+
object?: TObject,
87+
onUpdateElement: (object: TObject) => void,
88+
parentVisible?: boolean,
89+
}> {
90+
}
91+
92+
export class ArrayEditor<TObject extends Editable> extends React.Component<BaseEditorProps & {
93+
object?: Array<TObject>,
94+
onUpdateElement: (object: TObject, index: number) => void,
95+
onRemoveElements: (indices: Array<Number>) => void,
96+
onAddElement: (object: TObject) => void,
97+
parentVisible?: boolean,
98+
defaultRowsPerPage?: number,
99+
}> {
100+
}
62101

63102
export const PropTypes: {
64103
SchemaType: unknown, // TODO

0 commit comments

Comments
 (0)