@@ -26,6 +26,7 @@ import {
2626 isOmitOf ,
2727 isOneOf ,
2828 isOptionalOf ,
29+ isParametersOf ,
2930 isPartialOf ,
3031 isPickOf ,
3132 isPrimitive ,
@@ -633,6 +634,152 @@ Deno.test("isTupleOf<T, E>", async (t) => {
633634 ) ;
634635} ) ;
635636
637+ Deno . test ( "isParametersOf<T>" , async ( t ) => {
638+ await t . step ( "returns properly named function" , async ( t ) => {
639+ await assertSnapshot (
640+ t ,
641+ isParametersOf ( [ isNumber , isString , isOptionalOf ( isBoolean ) ] ) . name ,
642+ ) ;
643+ await assertSnapshot (
644+ t ,
645+ isParametersOf ( [ ( _x ) : _x is string => false ] ) . name ,
646+ ) ;
647+ await assertSnapshot (
648+ t ,
649+ isParametersOf ( [ ] ) . name ,
650+ ) ;
651+ // Nested
652+ await assertSnapshot (
653+ t ,
654+ isParametersOf ( [
655+ isParametersOf ( [
656+ isParametersOf ( [ isNumber , isString , isOptionalOf ( isBoolean ) ] ) ,
657+ ] ) ,
658+ ] ) . name ,
659+ ) ;
660+ } ) ;
661+ await t . step ( "returns proper type predicate" , ( ) => {
662+ const predTup = [
663+ isOptionalOf ( isNumber ) ,
664+ isString ,
665+ isOptionalOf ( isString ) ,
666+ isOptionalOf ( isBoolean ) ,
667+ ] as const ;
668+ const a : unknown = [ 0 , "a" ] ;
669+ if ( isParametersOf ( predTup ) ( a ) ) {
670+ assertType <
671+ Equal < typeof a , [ number | undefined , string , string ?, boolean ?] >
672+ > ( true ) ;
673+ }
674+ } ) ;
675+ await t . step ( "returns true on T tuple" , ( ) => {
676+ const predTup = [ isNumber , isString , isOptionalOf ( isBoolean ) ] as const ;
677+ assertEquals ( isParametersOf ( predTup ) ( [ 0 , "a" , true ] ) , true ) ;
678+ assertEquals ( isParametersOf ( predTup ) ( [ 0 , "a" ] ) , true ) ;
679+ } ) ;
680+ await t . step ( "returns false on non T tuple" , ( ) => {
681+ const predTup = [ isNumber , isString , isOptionalOf ( isBoolean ) ] as const ;
682+ assertEquals ( isParametersOf ( predTup ) ( [ 0 , 1 , 2 ] ) , false ) ;
683+ assertEquals ( isParametersOf ( predTup ) ( [ 0 , "a" , true , 0 ] ) , false ) ;
684+ } ) ;
685+ await testWithExamples (
686+ t ,
687+ isParametersOf ( [ ( _ : unknown ) : _ is unknown => true ] ) ,
688+ {
689+ excludeExamples : [ "array" ] ,
690+ } ,
691+ ) ;
692+ } ) ;
693+
694+ Deno . test ( "isParametersOf<T, E>" , async ( t ) => {
695+ await t . step ( "returns properly named function" , async ( t ) => {
696+ await assertSnapshot (
697+ t ,
698+ isParametersOf ( [ isNumber , isString , isOptionalOf ( isBoolean ) ] , isArray )
699+ . name ,
700+ ) ;
701+ await assertSnapshot (
702+ t ,
703+ isParametersOf ( [ ( _x ) : _x is string => false ] , isArrayOf ( isString ) )
704+ . name ,
705+ ) ;
706+ // Empty
707+ await assertSnapshot (
708+ t ,
709+ isParametersOf ( [ ] , isArrayOf ( isString ) ) . name ,
710+ ) ;
711+ // Nested
712+ await assertSnapshot (
713+ t ,
714+ isParametersOf ( [
715+ isParametersOf (
716+ [ isParametersOf (
717+ [ isNumber , isString , isOptionalOf ( isBoolean ) ] ,
718+ isArray ,
719+ ) ] ,
720+ isArray ,
721+ ) ,
722+ ] ) . name ,
723+ ) ;
724+ } ) ;
725+ await t . step ( "returns proper type predicate" , ( ) => {
726+ const predTup = [
727+ isOptionalOf ( isNumber ) ,
728+ isString ,
729+ isOptionalOf ( isString ) ,
730+ isOptionalOf ( isBoolean ) ,
731+ ] as const ;
732+ const predElse = isArrayOf ( isNumber ) ;
733+ const a : unknown = [ 0 , "a" ] ;
734+ if ( isParametersOf ( predTup , predElse ) ( a ) ) {
735+ assertType <
736+ Equal <
737+ typeof a ,
738+ [ number | undefined , string , string ?, boolean ?, ...number [ ] ]
739+ >
740+ > (
741+ true ,
742+ ) ;
743+ }
744+ } ) ;
745+ await t . step ( "returns true on T tuple" , ( ) => {
746+ const predTup = [ isNumber , isString , isOptionalOf ( isBoolean ) ] as const ;
747+ const predElse = isArrayOf ( isNumber ) ;
748+ assertEquals (
749+ isParametersOf ( predTup , predElse ) ( [ 0 , "a" , true , 0 , 1 , 2 ] ) ,
750+ true ,
751+ ) ;
752+ assertEquals (
753+ isParametersOf ( predTup , predElse ) ( [ 0 , "a" , undefined , 0 , 1 , 2 ] ) ,
754+ true ,
755+ ) ;
756+ assertEquals ( isParametersOf ( predTup , predElse ) ( [ 0 , "a" ] ) , true ) ;
757+ } ) ;
758+ await t . step ( "returns false on non T tuple" , ( ) => {
759+ const predTup = [ isNumber , isString , isOptionalOf ( isBoolean ) ] as const ;
760+ const predElse = isArrayOf ( isString ) ;
761+ assertEquals ( isParametersOf ( predTup , predElse ) ( [ 0 , 1 , 2 , 0 , 1 , 2 ] ) , false ) ;
762+ assertEquals ( isParametersOf ( predTup , predElse ) ( [ 0 , "a" , 0 , 1 , 2 ] ) , false ) ;
763+ assertEquals (
764+ isParametersOf ( predTup , predElse ) ( [ 0 , "a" , true , 0 , 1 , 2 ] ) ,
765+ false ,
766+ ) ;
767+ assertEquals (
768+ isParametersOf ( predTup , predElse ) ( [ 0 , "a" , undefined , 0 , 1 , 2 ] ) ,
769+ false ,
770+ ) ;
771+ assertEquals ( isParametersOf ( predTup , predElse ) ( [ 0 , "a" , "b" ] ) , false ) ;
772+ } ) ;
773+ const predElse = isArray ;
774+ await testWithExamples (
775+ t ,
776+ isParametersOf ( [ ( _ : unknown ) : _ is unknown => true ] , predElse ) ,
777+ {
778+ excludeExamples : [ "array" ] ,
779+ } ,
780+ ) ;
781+ } ) ;
782+
636783Deno . test ( "isReadonlyTupleOf<T>" , async ( t ) => {
637784 await t . step ( "returns properly named function" , async ( t ) => {
638785 await assertSnapshot (
0 commit comments