hapijs / joi

The most powerful data validation library for JS
Other
20.95k stars 1.51k forks source link

Types of `object` are incorrect #2978

Open felixmosh opened 1 year ago

felixmosh commented 1 year ago

Support plan

Context

What are you trying to achieve or the steps to reproduce?

const portSchema = Joi.number().integer().greater(2999).positive().required();
const hostSchema = Joi.alternatives([Joi.string().ip(), Joi.string().domain().allow('localhost')]).required();

const envSchema = Joi.object({
  NODE_ENV: Joi.string().valid('production', 'development', 'test').required(),
  PORT: portSchema.default(3000).optional(),
  SERVICE_HOST: hostSchema,
  REDIS_PORT: portSchema,
  REDIS_HOST: hostSchema,
});

What was the result you got?

envSchema gets a type of Joi.ObjectSchema<any> instead of specific object, image

What result did you expect?

It should contain reflect the object type...

Maybe we can use the types from https://github.com/maghis/types-joi/blob/master/index.d.ts which do work

I've managed to change types to reflect object's keys by modifying this

object<TSchema = any, isStrict = false, T = TSchema>(schema?: SchemaMap<T, isStrict>): ObjectSchema<TSchema>;

into

object<TSchema = any, isStrict = false>(schema?: SchemaMap<TSchema, isStrict>): ObjectSchema<TSchema>;

image

But it sets unknown to each key.