From d2f98e472de4d63a11714c54280f67cd25c960df Mon Sep 17 00:00:00 2001 From: PopGoesTheWza <32041843+PopGoesTheWza@users.noreply.github.com> Date: Fri, 10 Sep 2021 10:26:13 +0200 Subject: [PATCH] Add `is.propertyKey` (#138) Co-authored-by: Sindre Sorhus Co-authored-by: Giora Guttsait --- readme.md | 4 ++++ source/index.ts | 5 +++++ test/test.ts | 14 ++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/readme.md b/readme.md index adb9910..76f167d 100644 --- a/readme.md +++ b/readme.md @@ -428,6 +428,10 @@ Returns `true` if `value` is an even integer. Returns `true` if `value` is an odd integer. +##### .propertyKey(value) + +Returns `true` if `value` can be used as an object property key (either `string`, `number`, or `symbol`). + ##### .any(predicate | predicate[], ...values) Using a single `predicate` argument, returns `true` if **any** of the input `values` returns true in the `predicate`: diff --git a/source/index.ts b/source/index.ts index d9fb699..875794a 100644 --- a/source/index.ts +++ b/source/index.ts @@ -360,6 +360,9 @@ is.nonEmptySet = (value: unknown): value is Set => is.set(value) is.emptyMap = (value: unknown): value is Map => is.map(value) && value.size === 0; is.nonEmptyMap = (value: unknown): value is Map => is.map(value) && value.size > 0; +// `PropertyKey` is any value that can be used as an object key (string, number, or symbol) +is.propertyKey = (value: unknown): value is PropertyKey => is.any([is.string, is.number, is.symbol], value); + export type Predicate = (value: unknown) => boolean; type ArrayMethod = (fn: (value: unknown, index: number, array: unknown[]) => boolean, thisArg?: unknown) => boolean; @@ -519,6 +522,7 @@ interface Assert { nonEmptySet: (value: unknown) => asserts value is Set; emptyMap: (value: unknown) => asserts value is Map; nonEmptyMap: (value: unknown) => asserts value is Map; + propertyKey: (value: unknown) => asserts value is PropertyKey; // Numbers. evenInteger: (value: number) => asserts value is number; @@ -616,6 +620,7 @@ export const assert: Assert = { nonEmptySet: (value: unknown): asserts value is Set => assertType(is.nonEmptySet(value), AssertionTypeDescription.nonEmptySet, value), emptyMap: (value: unknown): asserts value is Map => assertType(is.emptyMap(value), AssertionTypeDescription.emptyMap, value), nonEmptyMap: (value: unknown): asserts value is Map => assertType(is.nonEmptyMap(value), AssertionTypeDescription.nonEmptyMap, value), + propertyKey: (value: unknown): asserts value is number => assertType(is.propertyKey(value), 'PropertyKey', value), // Numbers. evenInteger: (value: number): asserts value is number => assertType(is.evenInteger(value), AssertionTypeDescription.evenInteger, value), diff --git a/test/test.ts b/test/test.ts index 30c1a86..6c2ae57 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1490,6 +1490,20 @@ test('is.nonEmptyMap', t => { }); }); +test('is.propertyKey', t => { + t.true(is.propertyKey('key')); + t.true(is.propertyKey(42)); + t.true(is.propertyKey(Symbol(''))); + + t.false(is.propertyKey(null)); + t.false(is.propertyKey(undefined)); + t.false(is.propertyKey(true)); + t.false(is.propertyKey({})); + t.false(is.propertyKey([])); + t.false(is.propertyKey(new Map())); + t.false(is.propertyKey(new Set())); +}); + test('is.any', t => { t.true(is.any(is.string, {}, true, '🦄')); t.true(is.any(is.object, false, {}, 'unicorns'));