@@ -2,7 +2,8 @@ import { assertEquals } from "@std/assert";
22import { assertType } from "@std/testing/types" ;
33import { type Equal , testWithExamples } from "../_testutil.ts" ;
44import { is } from "../is/mod.ts" ;
5- import { asOptional , asUnoptional } from "./optional.ts" ;
5+ import type { AsOptional } from "../_annotation.ts" ;
6+ import { asOptional , asUnoptional , hasOptional } from "./optional.ts" ;
67
78Deno . test ( "asOptional<T>" , async ( t ) => {
89 await t . step ( "returns a property named predicate function" , ( ) => {
@@ -153,3 +154,23 @@ Deno.test("asUnoptional<T>", async (t) => {
153154 } ) ;
154155 } ) ;
155156} ) ;
157+
158+ Deno . test ( "hasOptional<P>" , async ( t ) => {
159+ await t . step ( "returns true on AsOptional<T> predicate" , ( ) => {
160+ const pred = asOptional ( is . Number ) ;
161+ assertEquals ( hasOptional ( pred ) , true ) ;
162+ } ) ;
163+
164+ await t . step ( "returns true on non AsOptional<T> predicate" , ( ) => {
165+ const pred = is . Number ;
166+ assertEquals ( hasOptional ( pred ) , false ) ;
167+ } ) ;
168+
169+ await t . step ( "predicated type is correct" , ( ) => {
170+ const pred = asOptional ( is . Number ) ;
171+ type P = typeof pred ;
172+ if ( hasOptional ( pred ) ) {
173+ assertType < Equal < typeof pred , P & AsOptional < number > > > ( true ) ;
174+ }
175+ } ) ;
176+ } ) ;
0 commit comments