tangled
alpha
login
or
join now
tylur.dev
/
prototypey
prototypey.org - atproto lexicon typescript toolkit - mirror https://github.com/tylersayshi/prototypey
1
fork
atom
overview
issues
pulls
pipelines
example and inference done for simple case... tests to come
Tyler
4 months ago
a222b791
6e32af66
+39
-13
1 changed file
expand all
collapse all
unified
split
src
infer.ts
+39
-13
src/infer.ts
···
1
1
+
// deno-lint-ignore-file ban-types
1
2
type InferType<T> = T extends { type: "record" } ? InferRecord<T>
2
3
: T extends { type: "object" } ? InferObject<T>
3
4
: T extends { type: "array" } ? InferArray<T>
···
17
18
18
19
type InferToken<T> = T extends { enum: readonly (infer U)[] } ? U : string;
19
20
20
20
-
type InferObject<T> = T extends { properties: infer P } ?
21
21
-
& {
22
22
-
-readonly [K in keyof P as P[K] extends { type: string } ? K : never]?:
23
23
-
InferType<
24
24
-
P[K]
25
25
-
>;
26
26
-
}
27
27
-
& (T extends { required?: readonly (infer R)[] } ? {
28
28
-
-readonly [K in R extends string ? R : never]-?: InferType<
21
21
+
type GetRequired<T> = T extends { required: readonly (infer R)[] } ? R : never;
22
22
+
type GetNullable<T> = T extends { nullable: readonly (infer N)[] } ? N : never;
23
23
+
24
24
+
type InferObject<
25
25
+
T,
26
26
+
Nullable extends string = GetNullable<T> & string,
27
27
+
Required extends string = GetRequired<T> & string,
28
28
+
NullableAndRequired extends string = Required & Nullable & string,
29
29
+
Normal extends string = "properties" extends keyof T
30
30
+
? Exclude<keyof T["properties"], Required | Nullable> & string
31
31
+
: never,
32
32
+
> = Prettify<
33
33
+
T extends { properties: infer P } ?
34
34
+
& {
35
35
+
-readonly [
36
36
+
K in Normal
37
37
+
]?: InferType<
29
38
P[K & keyof P]
30
39
>;
31
40
}
32
32
-
: never)
33
33
-
: never;
41
41
+
& ({
42
42
+
-readonly [K in Exclude<Required, NullableAndRequired>]-?: InferType<
43
43
+
P[K & keyof P]
44
44
+
>;
45
45
+
})
46
46
+
& ({
47
47
+
-readonly [K in Exclude<Nullable, NullableAndRequired>]?:
48
48
+
| InferType<
49
49
+
P[K & keyof P]
50
50
+
>
51
51
+
| null;
52
52
+
})
53
53
+
& ({
54
54
+
-readonly [K in NullableAndRequired]:
55
55
+
| InferType<
56
56
+
P[K & keyof P]
57
57
+
>
58
58
+
| null;
59
59
+
})
60
60
+
: {}
61
61
+
>;
34
62
35
63
type InferArray<T> = T extends { items: infer Items } ? InferType<Items>[]
36
64
: never[];
···
56
84
& {
57
85
[K in keyof T]: T[K];
58
86
}
59
59
-
// deno-lint-ignore ban-types
60
87
& {};
61
88
62
89
export type InferDefs<T extends Record<string, unknown>> = Prettify<
···
89
116
"maxGraphemes": 256,
90
117
},
91
118
},
92
92
-
"nullable": ["displayName"],
93
119
},
94
120
},
95
121
},