@@ -489,12 +489,12 @@ const Spec = {
489489 return specValidator || Spec . any
490490 } ,
491491
492- checkProps ( { required , optional , extensible = false , validate } : {
493- required ?: Record < string , Validator > ,
494- optional ?: Record < string , Validator > ,
495- extensible ?: boolean ,
496- validate ?: Validator
497- } ) : SpecValidator {
492+ checkProps < T extends object = any > ( {
493+ required,
494+ optional,
495+ extensible,
496+ validate
497+ } : CheckPropsConfig < T > ) : SpecValidator {
498498 return Spec . and (
499499 Spec . props ( { required, optional, validate } ) ,
500500
@@ -1088,3 +1088,18 @@ function _checkConstraint(constraint: Validator, it: any, path: null | string =
10881088
10891089 return ret
10901090}
1091+
1092+ type PickOptionalProps < T extends object > = Pick < T , {
1093+ [ K in keyof T ] -?: T extends Record < K , T [ K ] > ? never : K
1094+ } [ keyof T ] >
1095+
1096+ type PickRequiredProps < T extends object > = Pick < T , {
1097+ [ K in keyof T ] -?: T extends Record < K , T [ K ] > ? K : never
1098+ } [ keyof T ] >
1099+
1100+ type CheckPropsConfig < T extends object = any > = {
1101+ required ?: { [ K in keyof Partial < PickRequiredProps < T > > ] : Validator < T [ K ] > } ,
1102+ optional ?: { [ K in keyof PickOptionalProps < T > ] : Validator < Exclude < T [ K ] , undefined > > } ,
1103+ extensible ?: boolean ,
1104+ validate ?: Validator < T >
1105+ }
0 commit comments