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
···
0
1
type InferType<T> = T extends { type: "record" } ? InferRecord<T>
2
: T extends { type: "object" } ? InferObject<T>
3
: T extends { type: "array" } ? InferArray<T>
···
17
18
type InferToken<T> = T extends { enum: readonly (infer U)[] } ? U : string;
19
20
-
type InferObject<T> = T extends { properties: infer P } ?
21
-
& {
22
-
-readonly [K in keyof P as P[K] extends { type: string } ? K : never]?:
23
-
InferType<
24
-
P[K]
25
-
>;
26
-
}
27
-
& (T extends { required?: readonly (infer R)[] } ? {
28
-
-readonly [K in R extends string ? R : never]-?: InferType<
0
0
0
0
0
0
0
0
29
P[K & keyof P]
30
>;
31
}
32
-
: never)
33
-
: never;
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
34
35
type InferArray<T> = T extends { items: infer Items } ? InferType<Items>[]
36
: never[];
···
56
& {
57
[K in keyof T]: T[K];
58
}
59
-
// deno-lint-ignore ban-types
60
& {};
61
62
export type InferDefs<T extends Record<string, unknown>> = Prettify<
···
89
"maxGraphemes": 256,
90
},
91
},
92
-
"nullable": ["displayName"],
93
},
94
},
95
},
···
1
+
// deno-lint-ignore-file ban-types
2
type InferType<T> = T extends { type: "record" } ? InferRecord<T>
3
: T extends { type: "object" } ? InferObject<T>
4
: T extends { type: "array" } ? InferArray<T>
···
18
19
type InferToken<T> = T extends { enum: readonly (infer U)[] } ? U : string;
20
21
+
type GetRequired<T> = T extends { required: readonly (infer R)[] } ? R : never;
22
+
type GetNullable<T> = T extends { nullable: readonly (infer N)[] } ? N : never;
23
+
24
+
type InferObject<
25
+
T,
26
+
Nullable extends string = GetNullable<T> & string,
27
+
Required extends string = GetRequired<T> & string,
28
+
NullableAndRequired extends string = Required & Nullable & string,
29
+
Normal extends string = "properties" extends keyof T
30
+
? Exclude<keyof T["properties"], Required | Nullable> & string
31
+
: never,
32
+
> = Prettify<
33
+
T extends { properties: infer P } ?
34
+
& {
35
+
-readonly [
36
+
K in Normal
37
+
]?: InferType<
38
P[K & keyof P]
39
>;
40
}
41
+
& ({
42
+
-readonly [K in Exclude<Required, NullableAndRequired>]-?: InferType<
43
+
P[K & keyof P]
44
+
>;
45
+
})
46
+
& ({
47
+
-readonly [K in Exclude<Nullable, NullableAndRequired>]?:
48
+
| InferType<
49
+
P[K & keyof P]
50
+
>
51
+
| null;
52
+
})
53
+
& ({
54
+
-readonly [K in NullableAndRequired]:
55
+
| InferType<
56
+
P[K & keyof P]
57
+
>
58
+
| null;
59
+
})
60
+
: {}
61
+
>;
62
63
type InferArray<T> = T extends { items: infer Items } ? InferType<Items>[]
64
: never[];
···
84
& {
85
[K in keyof T]: T[K];
86
}
0
87
& {};
88
89
export type InferDefs<T extends Record<string, unknown>> = Prettify<
···
116
"maxGraphemes": 256,
117
},
118
},
0
119
},
120
},
121
},