From b12fcef9807f4b6c00ab650d4dcd859bd25ca633 Mon Sep 17 00:00:00 2001 From: Tal Mac Date: Sat, 22 Jul 2023 02:02:37 +0300 Subject: [PATCH] Add Type tests --- readme.md | 7 +++++-- test/test.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 06a39dc..40726c5 100644 --- a/readme.md +++ b/readme.md @@ -415,15 +415,18 @@ foo(); A `value` is tuple-like if it matches the provided `guards` array both in `.length` and in types. ```js -is.tupleLike([1],[is.number]); +is.tupleLike([1], [is.number]); //=> true +``` +```js function foo() { - const tuple = [1, '2', true] + const tuple = [1, '2', true]; if (is.tupleLike(tuple, [is.number, is.string, is.boolean])) { tuple // [number, string, boolean] } } + foo(); ``` diff --git a/test/test.ts b/test/test.ts index 7ee9504..5db468e 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1480,6 +1480,47 @@ test('is.tupleLike', t => { t.throws(() => { assert.tupleLike(new Map(), [is.map]); }); + + { + const tuple = [[false, 'unicorn'], 'string', true]; + const function_ = (value: string) => value; + + if (is.tupleLike(tuple, [is.array, is.string, is.boolean])) { + if (is.tupleLike(tuple[0], [is.boolean, is.string])) { // eslint-disable-line unicorn/no-lonely-if + const value = tuple[0][1]; + function_(value); + } + } + } + + { + const tuple = [{isTest: true}, '1', true, null]; + const function_ = (value: Record) => value; + + if (is.tupleLike(tuple, [is.nonEmptyObject, is.string, is.boolean, is.null_])) { + const value = tuple[0]; + function_(value); + } + } + + { + const tuple = [1, '1', true, null, undefined]; + // eslint-disable-next-line @typescript-eslint/ban-types + const function_ = (value: number | string | boolean | undefined | null) => value; + + if (is.tupleLike(tuple, [is.number, is.string, is.boolean, is.undefined, is.null_])) { + const numericValue = tuple[0]; + const stringValue = tuple[1]; + const booleanValue = tuple[2]; + const undefinedValue = tuple[3]; + const nullValue = tuple[4]; + function_(numericValue); + function_(stringValue); + function_(booleanValue); + function_(undefinedValue); + function_(nullValue); + } + } }); test('is.inRange', t => {