Skip to content

Commit

Permalink
fix: support tuples inside oneOf/anyOf/allOf
Browse files Browse the repository at this point in the history
  • Loading branch information
lbguilherme committed Dec 28, 2020
1 parent 8c705d3 commit afa1c0b
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
21 changes: 8 additions & 13 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,10 @@ declare namespace AsTypedInternal {
? boolean
: SchemaType extends SchemaDeclaration<number>
? number
: SchemaType extends TupleSchema<infer TupleType, infer Additional>
? Additional extends null
? AsTypedTupleSchema<TupleType>
: AsTypedTupleSchemaWithAdditional<TupleType, Additional>
: SchemaType extends Not<infer T>
? ResolveNot<T>
: SchemaType extends ObjectSchema<
Expand All @@ -252,32 +256,23 @@ declare namespace AsTypedInternal {
| ResolveRecursiveInternal<Omit<SchemaType, "type"> & { type: Rest }>
: never;

// TODO

type ResolveOneOf<InnerSchema> = InnerSchema;

// High order resolution changes the schema before resolving it to typed

type ResolveHighOrder<
SchemaToResolve extends SchemaBase
> = SchemaToResolve extends IfThenElseSchema<infer If, infer Then, infer Else>
? (If & Then) | Else
: SchemaToResolve extends OneOf<infer Inner>
? ResolveOneOf<Inner>
? Inner
: SchemaToResolve extends AllOf<infer Inner>
? UnionToIntersection<Inner>
: SchemaToResolve extends AnyOf<infer Inner>
? Inner
: SchemaToResolve;

type ResolveRecursive<SchemaType> = SchemaType extends TupleSchema<
infer TupleType,
infer Additional
>
? Additional extends null
? AsTypedTupleSchema<TupleType>
: AsTypedTupleSchemaWithAdditional<TupleType, Additional>
: ResolveRecursiveInternal<ResolveHighOrder<SchemaType>>;
type ResolveRecursive<SchemaType> = ResolveRecursiveInternal<
ResolveHighOrder<SchemaType>
>;

type MapPropsToRefs<
RootSchema,
Expand Down
24 changes: 24 additions & 0 deletions test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,30 @@ assert(
_ as string | number
);

assert(
_ as AsTyped<{
oneOf: [{ type: "string" }, { type: "array"; items: { type: "string" } }];
}>,
_ as string | string[]
);

assert(
_ as AsTyped<{
oneOf: [{ type: "string" }, { type: "array"; items: [] }];
}>,
_ as string | []
);

assert(
_ as AsTyped<{
oneOf: [
{ type: "array"; items: [{ type: "string" }] },
{ type: "array"; items: [] }
];
}>,
_ as [string] | []
);

assert(
_ as AsTyped<{
oneOf: [
Expand Down

0 comments on commit afa1c0b

Please sign in to comment.