From 165ec21fb4574fed3447ce4b7191d1bb4f0c083e Mon Sep 17 00:00:00 2001 From: Hossein Saniei Date: Mon, 4 Nov 2019 21:21:23 +0330 Subject: [PATCH] feat(@types/hapi__joi): accept generic schema types in ObjectSchemas (#39281) --- types/hapi__joi/hapi__joi-tests.ts | 39 ++++++++++++++++++++++++++++++ types/hapi__joi/index.d.ts | 14 +++++------ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/types/hapi__joi/hapi__joi-tests.ts b/types/hapi__joi/hapi__joi-tests.ts index 7ad8b18905..9b2dc26291 100644 --- a/types/hapi__joi/hapi__joi-tests.ts +++ b/types/hapi__joi/hapi__joi-tests.ts @@ -1100,3 +1100,42 @@ schema = Joi.symbol().map(new Map()); schema = Joi.symbol().map({ key: Symbol('asd'), }); + +// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- +// Test generic types + +interface User { + name: string; + family?: string; + age: number; +} + +const userSchemaObject = Joi.object({ + name: Joi.string().required(), + family: Joi.string(), +}); + +let userSchema = Joi.object().keys({ + name: Joi.string().required(), + family: Joi.string(), +}); + +userSchema = userSchema.append({ + age: Joi.number(), +}); + +userSchema = userSchema.append({ + height: Joi.number(), // $ExpectError +}); + +const userSchemaError = Joi.object().keys({ + name: Joi.string().required(), + family: Joi.string(), + height: Joi.number(), // $ExpectError +}); + +const userSchemaObjectError = Joi.object({ + name: Joi.string().required(), + family: Joi.string(), + height: Joi.number(), // $ExpectError +}); diff --git a/types/hapi__joi/index.d.ts b/types/hapi__joi/index.d.ts index 7a2203bc70..4e1bcfafa8 100644 --- a/types/hapi__joi/index.d.ts +++ b/types/hapi__joi/index.d.ts @@ -660,9 +660,9 @@ declare namespace Joi { type SchemaLike = string | number | boolean | object | null | Schema | SchemaMap; - interface SchemaMap { - [key: string]: SchemaLike | SchemaLike[]; - } + type SchemaMap = { + [key in keyof TSchema]?: SchemaLike | SchemaLike[]; + }; type Schema = AnySchema | ArraySchema @@ -1502,7 +1502,7 @@ declare namespace Joi { matches: SchemaLike | Reference; } - interface ObjectSchema extends AnySchema { + interface ObjectSchema extends AnySchema { /** * Defines an all-or-nothing relationship between keys where if one of the peers is present, all of them are required as well. * @@ -1513,7 +1513,7 @@ declare namespace Joi { /** * Appends the allowed object keys. If schema is null, undefined, or {}, no changes will be applied. */ - append(schema?: SchemaMap): this; + append(schema?: SchemaMap): this; /** * Verifies an assertion where. @@ -1532,7 +1532,7 @@ declare namespace Joi { /** * Sets or extends the allowed object keys. */ - keys(schema?: SchemaMap): this; + keys(schema?: SchemaMap): this; /** * Specifies the exact number of keys in the object. @@ -1919,7 +1919,7 @@ declare namespace Joi { /** * Generates a schema object that matches an object data type (as well as JSON strings that have been parsed into objects). */ - object(schema?: SchemaMap): ObjectSchema; + object(schema?: SchemaMap): ObjectSchema; /** * Generates a schema object that matches a string data type. Note that empty strings are not allowed by default and must be enabled with allow('').