prototypey.org - atproto lexicon typescript toolkit - mirror https://github.com/tylersayshi/prototypey

example and inference done for simple case... tests to come

Tyler a222b791 6e32af66

+39 -13
+39 -13
src/infer.ts
··· 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 - 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< 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< 29 38 P[K & keyof P] 30 39 >; 31 40 } 32 - : never) 33 - : never; 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 + >; 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 - // 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 - "nullable": ["displayName"], 93 119 }, 94 120 }, 95 121 },