From afa1c0b5996502ba3c795565b3cfd3dd830cadb8 Mon Sep 17 00:00:00 2001 From: Guilherme Bernal Date: Mon, 28 Dec 2020 21:31:53 +0000 Subject: [PATCH] fix: support tuples inside oneOf/anyOf/allOf --- index.d.ts | 21 ++++++++------------- test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/index.d.ts b/index.d.ts index 9a1c733..9ae5b57 100644 --- a/index.d.ts +++ b/index.d.ts @@ -226,6 +226,10 @@ declare namespace AsTypedInternal { ? boolean : SchemaType extends SchemaDeclaration ? number + : SchemaType extends TupleSchema + ? Additional extends null + ? AsTypedTupleSchema + : AsTypedTupleSchemaWithAdditional : SchemaType extends Not ? ResolveNot : SchemaType extends ObjectSchema< @@ -252,10 +256,6 @@ declare namespace AsTypedInternal { | ResolveRecursiveInternal & { type: Rest }> : never; - // TODO - - type ResolveOneOf = InnerSchema; - // High order resolution changes the schema before resolving it to typed type ResolveHighOrder< @@ -263,21 +263,16 @@ declare namespace AsTypedInternal { > = SchemaToResolve extends IfThenElseSchema ? (If & Then) | Else : SchemaToResolve extends OneOf - ? ResolveOneOf + ? Inner : SchemaToResolve extends AllOf ? UnionToIntersection : SchemaToResolve extends AnyOf ? Inner : SchemaToResolve; - type ResolveRecursive = SchemaType extends TupleSchema< - infer TupleType, - infer Additional - > - ? Additional extends null - ? AsTypedTupleSchema - : AsTypedTupleSchemaWithAdditional - : ResolveRecursiveInternal>; + type ResolveRecursive = ResolveRecursiveInternal< + ResolveHighOrder + >; type MapPropsToRefs< RootSchema, diff --git a/test.ts b/test.ts index 3be1622..2cef9a1 100644 --- a/test.ts +++ b/test.ts @@ -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: [