From b63526d1b14c4dc2aa71a03f9ca6cc7aefed490e Mon Sep 17 00:00:00 2001 From: Lexus Drumgold <unicornware@flexdevelopment.llc> Date: Sat, 13 May 2023 04:31:41 -0400 Subject: [PATCH] feat(types): `IsAny`, `IfAny` Signed-off-by: Lexus Drumgold <unicornware@flexdevelopment.llc> --- src/types/__tests__/if-any.spec-d.ts | 19 +++++++++++++++++++ src/types/__tests__/is-any.spec-d.ts | 16 ++++++++++++++++ src/types/if-any.ts | 19 +++++++++++++++++++ src/types/index.ts | 2 ++ src/types/is-any.ts | 13 +++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 src/types/__tests__/if-any.spec-d.ts create mode 100644 src/types/__tests__/is-any.spec-d.ts create mode 100644 src/types/if-any.ts create mode 100644 src/types/is-any.ts diff --git a/src/types/__tests__/if-any.spec-d.ts b/src/types/__tests__/if-any.spec-d.ts new file mode 100644 index 00000000..a6bb5f5e --- /dev/null +++ b/src/types/__tests__/if-any.spec-d.ts @@ -0,0 +1,19 @@ +/** + * @file Type Tests - IfAny + * @module tutils/types/tests/unit-d/IfAny + */ + +import type TestSubject from '../if-any' + +describe('unit-d:types/IfAny', () => { + type False = false + type True = true + + it('should equal False if IsAny<T> extends false', () => { + expectTypeOf<TestSubject<any[], True, False>>().toEqualTypeOf<False>() + }) + + it('should equal True if IsAny<T> extends true', () => { + expectTypeOf<TestSubject<any, True, False>>().toEqualTypeOf<True>() + }) +}) diff --git a/src/types/__tests__/is-any.spec-d.ts b/src/types/__tests__/is-any.spec-d.ts new file mode 100644 index 00000000..d1815043 --- /dev/null +++ b/src/types/__tests__/is-any.spec-d.ts @@ -0,0 +1,16 @@ +/** + * @file Type Tests - IsAny + * @module tutils/types/tests/unit-d/IsAny + */ + +import type TestSubject from '../is-any' + +describe('unit-d:types/IsAny', () => { + it('should equal false if T is not any', () => { + expectTypeOf<TestSubject<number>>().toEqualTypeOf<false>() + }) + + it('should equal true if T is any', () => { + expectTypeOf<TestSubject<any>>().toEqualTypeOf<true>() + }) +}) diff --git a/src/types/if-any.ts b/src/types/if-any.ts new file mode 100644 index 00000000..8ae3b083 --- /dev/null +++ b/src/types/if-any.ts @@ -0,0 +1,19 @@ +/** + * @file Type Definitions - IfAny + * @module tutils/types/IfAny + */ + +import type IsAny from './is-any' + +/** + * Conditional type that resolves depending on whether or not `T` is type `any`. + * + * @see {@linkcode IsAny} + * + * @template T - Type to evaluate + * @template True - Type if `T` is type `any` + * @template False - Type if `T` is not type `any` + */ +type IfAny<T, True, False> = IsAny<T> extends true ? True : False + +export type { IfAny as default } diff --git a/src/types/index.ts b/src/types/index.ts index dbe3f8b4..2a45a8cb 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -22,7 +22,9 @@ export type { default as Fallback } from './fallback' export type { default as FIXME } from './fixme' export type { default as Fn } from './fn' export type { default as Get } from './get' +export type { default as IfAny } from './if-any' export type { default as IndexSignature } from './index-signature' +export type { default as IsAny } from './is-any' export type { default as IsTuple } from './is-tuple' export type { default as Join } from './join' export type { default as JsonArray } from './json-array' diff --git a/src/types/is-any.ts b/src/types/is-any.ts new file mode 100644 index 00000000..9bd1434a --- /dev/null +++ b/src/types/is-any.ts @@ -0,0 +1,13 @@ +/** + * @file Type Definitions - IsAny + * @module tutils/types/IsAny + */ + +/** + * Returns a boolean indicating if `T` is type `any`. + * + * @template T - Type to evaluate + */ +type IsAny<T> = 0 extends T & 1 ? true : false + +export type { IsAny as default }