@@ -13,6 +13,7 @@ import is, {
1313 isRecord ,
1414 isRecordOf ,
1515 isString ,
16+ isTupleOf ,
1617 isUndefined ,
1718} from "./is.ts" ;
1819
@@ -22,6 +23,7 @@ Deno.test("is defines aliases of functions", () => {
2223 assertStrictEquals ( is . Boolean , isBoolean ) ;
2324 assertStrictEquals ( is . Array , isArray ) ;
2425 assertStrictEquals ( is . ArrayOf , isArrayOf ) ;
26+ assertStrictEquals ( is . TupleOf , isTupleOf ) ;
2527 assertStrictEquals ( is . Record , isRecord ) ;
2628 assertStrictEquals ( is . RecordOf , isRecordOf ) ;
2729 assertStrictEquals ( is . Function , isFunction ) ;
@@ -112,6 +114,26 @@ Deno.test("isArrayOf<T>", async (t) => {
112114 } ) ;
113115} ) ;
114116
117+ Deno . test ( "isTupleOf<T>" , async ( t ) => {
118+ await t . step ( "returns true on T tuple" , ( ) => {
119+ const predTup = [ isNumber , isString , isBoolean ] as const ;
120+ assertEquals ( isTupleOf ( predTup ) ( [ 0 , "a" , true ] ) , true ) ;
121+ } ) ;
122+ await t . step ( "returns false on non T tuple" , ( ) => {
123+ const predTup = [ isNumber , isString , isBoolean ] as const ;
124+ assertEquals ( isTupleOf ( predTup ) ( [ 0 , 1 , 2 ] ) , false ) ;
125+ assertEquals ( isTupleOf ( predTup ) ( [ 0 , "a" ] ) , false ) ;
126+ assertEquals ( isTupleOf ( predTup ) ( [ 0 , "a" , true , 0 ] ) , false ) ;
127+ } ) ;
128+ await t . step ( "returns proper type predicate" , ( ) => {
129+ const predTup = [ isNumber , isString , isBoolean ] as const ;
130+ const a : unknown = [ 0 , "a" , true ] ;
131+ if ( isTupleOf ( predTup ) ( a ) ) {
132+ const _ : [ number , string , boolean ] = a ;
133+ }
134+ } ) ;
135+ } ) ;
136+
115137Deno . test ( "isRecord" , async ( t ) => {
116138 await t . step ( "returns true on record" , ( ) => {
117139 assertEquals ( isRecord ( { } ) , true ) ;
0 commit comments