@avstantso/ts 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +77 -4
- package/dist/_global/_register.d.ts +80 -0
- package/dist/_global/array/_register.d.ts +28 -0
- package/dist/_global/array/arr-n.d.ts +21 -0
- package/dist/_global/array/create.d.ts +59 -0
- package/dist/_global/array/derivative.d.ts +229 -0
- package/dist/_global/array/find.d.ts +89 -0
- package/dist/_global/array/index.d.ts +8 -0
- package/dist/_global/array/low-level.d.ts +84 -0
- package/dist/_global/array/map-key-value.d.ts +121 -0
- package/dist/_global/array/min-max-sort.d.ts +244 -0
- package/dist/_global/ascii.d.ts +84 -0
- package/dist/_global/boolean.d.ts +74 -0
- package/dist/_global/comparisons.d.ts +85 -0
- package/dist/_global/func.d.ts +17 -0
- package/dist/_global/index.d.ts +14 -0
- package/dist/_global/literal.d.ts +184 -0
- package/dist/_global/numeric/domain/describes.d.ts +62 -0
- package/dist/_global/numeric/domain/generated.d.ts +11240 -0
- package/dist/_global/numeric/domain/inc-dec.d.ts +52 -0
- package/dist/_global/numeric/domain/independent.d.ts +203 -0
- package/dist/_global/numeric/domain/index.d.ts +4 -0
- package/dist/_global/numeric/inc-dec.d.ts +50 -0
- package/dist/_global/numeric/index.d.ts +3 -0
- package/dist/_global/numeric/math.d.ts +257 -0
- package/dist/_global/resolve.d.ts +45 -0
- package/dist/_global/string.d.ts +335 -0
- package/dist/_global/structure/_register.d.ts +93 -0
- package/dist/_global/structure/index.d.ts +2 -0
- package/dist/_global/structure/structure.d.ts +289 -0
- package/dist/_global/type/_register.d.ts +70 -0
- package/dist/_global/type/def.d.ts +47 -0
- package/dist/_global/type/index.d.ts +7 -0
- package/dist/_global/type/key-arr-def.d.ts +14 -0
- package/dist/_global/type/key-def.d.ts +76 -0
- package/dist/_global/type/key-literal-default-arr.d.ts +45 -0
- package/dist/_global/type/not.d.ts +44 -0
- package/dist/_global/type/union.d.ts +33 -0
- package/dist/_global/union.d.ts +79 -0
- package/dist/_global/utility/alt.d.ts +58 -0
- package/dist/_global/utility/flat.d.ts +60 -0
- package/dist/_global/utility/if-def.d.ts +22 -0
- package/dist/_global/utility/index.d.ts +9 -0
- package/dist/_global/utility/merge.d.ts +29 -0
- package/dist/_global/utility/opaque.d.ts +17 -0
- package/dist/_global/utility/options.d.ts +34 -0
- package/dist/_global/utility/override.d.ts +100 -0
- package/dist/_global/utility/replace-key.d.ts +33 -0
- package/dist/_global/utility/required-optional.d.ts +24 -0
- package/dist/_std-ext/index.d.ts +1 -0
- package/dist/_std-ext/object.d.ts +23 -0
- package/dist/export.d.ts +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +480 -0
- package/dist/index.js.map +1 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
|
|
4
|
+
## [1.3.0] - 2026-01-31
|
|
5
|
+
|
|
6
|
+
### Changed
|
|
7
|
+
|
|
8
|
+
- Fix `String.Cases`, `FilterUnique` -> `Filter + Filter.Unique`
|
|
9
|
+
- Add `String` generic — caster to string with default, `ASCII.Letter` unions
|
|
10
|
+
|
|
11
|
+
## [1.2.1] - 2026-01-18
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Fix publishing
|
|
16
|
+
|
|
3
17
|
All notable changes to this project will be documented in this file.
|
|
4
18
|
|
|
5
19
|
## [1.1.0] - 2026-01-18
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Advanced TypeScript type system utilities and helpers for creating powerful gene
|
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
10
|
- **Type-level arithmetic** - Increment, decrement, addition, subtraction, multiplication, division, and power operations on numeric literals
|
|
11
|
-
- **Advanced array types** - Create, manipulate, sort, filter, and transform array types with utilities like `Create`, `Sort`, `
|
|
11
|
+
- **Advanced array types** - Create, manipulate, sort, filter, and transform array types with utilities like `Create`, `Sort`, `Filter`, `Filter.Unique`, `Reverse`, `Join`
|
|
12
12
|
- **String manipulation types** - String length, case conversions (camelCase, PascalCase, snake_case, kebab-case), trimming, replacement, and pattern matching
|
|
13
13
|
- **Union utilities** - Convert unions to intersections, tuples, test for union types, and more
|
|
14
14
|
- **Structure (object) utilities** - Deep type manipulation, key/value extraction, flattening, reversing, splitting, and combining
|
|
@@ -421,7 +421,31 @@ type WithUndefined = TS.Array.MergeUnique<[6, 1, 4], [1, 2, undefined, 1, 4, 2,
|
|
|
421
421
|
// [6, 1, 4, 2, undefined]
|
|
422
422
|
```
|
|
423
423
|
|
|
424
|
-
#### `TS.Array.
|
|
424
|
+
#### `TS.Array.Filter<TArr, TFilter = undefined>`
|
|
425
|
+
|
|
426
|
+
Create array type from array without items matching the filter.
|
|
427
|
+
|
|
428
|
+
**Type Parameters:**
|
|
429
|
+
- `TArr` - Array type to filter
|
|
430
|
+
- `TFilter` - Items to exclude (single item or array of items). Defaults to `undefined`
|
|
431
|
+
|
|
432
|
+
**Example:**
|
|
433
|
+
```typescript
|
|
434
|
+
import { TS } from '@avstantso/ts';
|
|
435
|
+
|
|
436
|
+
// Filter out specific value
|
|
437
|
+
type NoOnes = TS.Array.Filter<[1, 2, 3, 1, 4, 2, 5], 1>; // [2, 3, 4, 2, 5]
|
|
438
|
+
|
|
439
|
+
// Filter out multiple values
|
|
440
|
+
type Filtered = TS.Array.Filter<[1, 2, 3, undefined, 1, 4, undefined, 5], [2, 3, undefined]>;
|
|
441
|
+
// [1, 1, 4, 5]
|
|
442
|
+
|
|
443
|
+
// Default: filter undefined values
|
|
444
|
+
type NoUndefined = TS.Array.Filter<[1, 2, 3, undefined, 1, 4, undefined, 5]>;
|
|
445
|
+
// [1, 2, 3, 1, 4, 5]
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
##### `TS.Array.Filter.Unique<TArr>`
|
|
425
449
|
|
|
426
450
|
Create array type from array without duplicates.
|
|
427
451
|
|
|
@@ -429,8 +453,8 @@ Create array type from array without duplicates.
|
|
|
429
453
|
```typescript
|
|
430
454
|
import { TS } from '@avstantso/ts';
|
|
431
455
|
|
|
432
|
-
type Unique = TS.Array.
|
|
433
|
-
type WithUndefined = TS.Array.
|
|
456
|
+
type Unique = TS.Array.Filter.Unique<[1, 2, 3, 1, 4, 2, 5]>; // [1, 2, 3, 4, 5]
|
|
457
|
+
type WithUndefined = TS.Array.Filter.Unique<[1, 2, 3, undefined, 1, 4, undefined, 5]>;
|
|
434
458
|
// [1, 2, 3, undefined, 4, 5]
|
|
435
459
|
```
|
|
436
460
|
|
|
@@ -700,6 +724,26 @@ English uppercase letters array type: `['A', 'B', 'C', ..., 'Z']`.
|
|
|
700
724
|
|
|
701
725
|
English lowercase letters array type: `['a', 'b', 'c', ..., 'z']`.
|
|
702
726
|
|
|
727
|
+
#### `TS.ASCII.Letter<IsUpper = true>`
|
|
728
|
+
|
|
729
|
+
English letter union type generic by case.
|
|
730
|
+
|
|
731
|
+
**Example:**
|
|
732
|
+
```typescript
|
|
733
|
+
import { TS } from '@avstantso/ts';
|
|
734
|
+
|
|
735
|
+
type Upper = TS.ASCII.Letter<true>; // 'A' | 'B' | ... | 'Z'
|
|
736
|
+
type Lower = TS.ASCII.Letter<false>; // 'a' | 'b' | ... | 'z'
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
##### `TS.ASCII.Letter.Upper`
|
|
740
|
+
|
|
741
|
+
Union of English uppercase letters: `'A' | 'B' | 'C' | ... | 'Z'`.
|
|
742
|
+
|
|
743
|
+
##### `TS.ASCII.Letter.Lower`
|
|
744
|
+
|
|
745
|
+
Union of English lowercase letters: `'a' | 'b' | 'c' | ... | 'z'`.
|
|
746
|
+
|
|
703
747
|
#### `TS.ASCII`
|
|
704
748
|
|
|
705
749
|
Readonly array type of all ASCII characters (character codes 0-255).
|
|
@@ -828,6 +872,29 @@ type StrGreaterEq = TS.Comparisons.GTE<'b', 'b'>; // true
|
|
|
828
872
|
|
|
829
873
|
String type manipulation utilities.
|
|
830
874
|
|
|
875
|
+
### `TS.String<T, D = ''>`
|
|
876
|
+
|
|
877
|
+
Cast a value to string literal type with a default fallback.
|
|
878
|
+
|
|
879
|
+
**Type Parameters:**
|
|
880
|
+
- `T` - Value to convert to string
|
|
881
|
+
- `D` - Default value if `T` cannot be converted to string (default: `''`)
|
|
882
|
+
|
|
883
|
+
**Returns:** String literal type or `D` if conversion not possible
|
|
884
|
+
|
|
885
|
+
**Example:**
|
|
886
|
+
```typescript
|
|
887
|
+
import { TS } from '@avstantso/ts';
|
|
888
|
+
|
|
889
|
+
type FromString = TS.String<'abcd'>; // 'abcd'
|
|
890
|
+
type FromNumber = TS.String<123>; // '123'
|
|
891
|
+
type FromBoolean = TS.String<true>; // 'true'
|
|
892
|
+
type FromFalse = TS.String<false>; // 'false'
|
|
893
|
+
|
|
894
|
+
// With default fallback
|
|
895
|
+
type WithDefault = TS.String<object, 'fallback'>; // 'fallback'
|
|
896
|
+
```
|
|
897
|
+
|
|
831
898
|
### Basic String Types
|
|
832
899
|
|
|
833
900
|
#### `TS.String.Possible`
|
|
@@ -1025,6 +1092,12 @@ type Pascal = TS.String.Case<'p', Phrase>; // 'OhJingleBellsJingleBellsJingleAll
|
|
|
1025
1092
|
type Snake = TS.String.Case<'s', Phrase>; // 'oh_jingle_bells_jingle_bells_jingle_all_the_way'
|
|
1026
1093
|
type SnakeUp = TS.String.Case<'S', Phrase>; // 'OH_JINGLE_BELLS_JINGLE_BELLS_JINGLE_ALL_THE_WAY'
|
|
1027
1094
|
type Kebab = TS.String.Case<'k', Phrase>; // 'oh-jingle-bells-jingle-bells-jingle-all-the-way'
|
|
1095
|
+
|
|
1096
|
+
// Handles consecutive uppercase letters correctly
|
|
1097
|
+
type XMLCamel = TS.String.Case<'c', 'XMLHttpRequest'>; // 'xmlHttpRequest'
|
|
1098
|
+
type XMLPascal = TS.String.Case<'p', 'XMLHttpRequest'>; // 'XmlHttpRequest'
|
|
1099
|
+
type XMLSnake = TS.String.Case<'s', 'XMLHttpRequest'>; // 'xml_http_request'
|
|
1100
|
+
type XMLKebab = TS.String.Case<'k', 'XMLHttpRequest'>; // 'xml-http-request'
|
|
1028
1101
|
```
|
|
1029
1102
|
|
|
1030
1103
|
##### `TS.String.Case.Settings.Removes`
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
declare namespace AVStantso {
|
|
2
|
+
namespace TS {
|
|
3
|
+
/**
|
|
4
|
+
* @summary Check extends T1 to T2. Supports `undefined === undefined`.
|
|
5
|
+
* @template T1 Tested type 1
|
|
6
|
+
* @template T2 Tested type 2
|
|
7
|
+
* @template IfTrue Result, if `T1` extends `T2`
|
|
8
|
+
* @template IfFalse Result, if NOT `T1` extends `T2`
|
|
9
|
+
* @returns `IfFalse` or `IfTrue` param
|
|
10
|
+
* @example
|
|
11
|
+
* type n0 = CheckType<Extends<never, never>, never>;
|
|
12
|
+
* type n1 = CheckType<Extends<undefined, never>, never>;
|
|
13
|
+
* type n2 = CheckType<Extends<never, undefined>, never>;
|
|
14
|
+
*
|
|
15
|
+
* type u0 = CheckType<Extends<unknown, undefined>, false>;
|
|
16
|
+
* type u1 = CheckType<Extends<undefined, unknown>, false>;
|
|
17
|
+
* type u2 = CheckType<Extends<1, undefined>, false>;
|
|
18
|
+
* type u3 = CheckType<Extends<undefined, 2>, false>;
|
|
19
|
+
*
|
|
20
|
+
* type e0 = CheckType<Extends<undefined, undefined>, true>;
|
|
21
|
+
* type e1 = CheckType<Extends<0, 0>, true>;
|
|
22
|
+
* type e2 = CheckType<Extends<0, number>, true>;
|
|
23
|
+
* type e3 = CheckType<Extends<'a', 'a'>, true>;
|
|
24
|
+
* type e4 = CheckType<Extends<'a', string>, true>;
|
|
25
|
+
*
|
|
26
|
+
* type ne1 = CheckType<Extends<number, 0>, false>;
|
|
27
|
+
* type ne2 = CheckType<Extends<string, 'a'>, false>;
|
|
28
|
+
*/
|
|
29
|
+
type Extends<T1, T2, IfTrue = true, IfFalse = false> = T1 extends undefined ? T2 extends undefined ? IfTrue : IfFalse : T1 extends T2 ? IfTrue : IfFalse;
|
|
30
|
+
/**
|
|
31
|
+
* @summary TypeScript helpers for arrays
|
|
32
|
+
*/
|
|
33
|
+
namespace Array { }
|
|
34
|
+
/**
|
|
35
|
+
* @summary TypeScript helpers for string
|
|
36
|
+
*/
|
|
37
|
+
namespace String { }
|
|
38
|
+
}
|
|
39
|
+
namespace Code {
|
|
40
|
+
/**
|
|
41
|
+
* @summary TypeScript helpers utility
|
|
42
|
+
*/
|
|
43
|
+
namespace TS {
|
|
44
|
+
/**
|
|
45
|
+
* @summary [O]ne or readonly [L]ist of `T` utility
|
|
46
|
+
*/
|
|
47
|
+
interface OL {
|
|
48
|
+
/**
|
|
49
|
+
* @summary Check `candidate` includes into array or equals value.\
|
|
50
|
+
* `true` if both `undefined` or `null`
|
|
51
|
+
*/
|
|
52
|
+
in<T, O extends T | readonly T[]>(oneOrList: O, candidate: unknown): candidate is T;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
interface TS {
|
|
56
|
+
/**
|
|
57
|
+
* @summary Checks candidate has object key type
|
|
58
|
+
*/
|
|
59
|
+
isKey<K extends AVStantso.TS.Key>(candidate: unknown): candidate is K;
|
|
60
|
+
/**
|
|
61
|
+
* @summary Flat `structure` into `depth`.\
|
|
62
|
+
* ⚠ Creates wraps for functions with extended props, `this` context will loss
|
|
63
|
+
* @param structure Structure to flat
|
|
64
|
+
* @param depth Depth of flat. Default `1`
|
|
65
|
+
*/
|
|
66
|
+
flat<T extends object, Depth extends number = 1>(structure: T, depth?: Depth): AVStantso.TS.Flat<T, Depth>;
|
|
67
|
+
/**
|
|
68
|
+
* @summary [O]ne or readonly [L]ist of `T` utility
|
|
69
|
+
*/
|
|
70
|
+
OL: TS.OL;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
interface Code {
|
|
74
|
+
/**
|
|
75
|
+
* @summary TypeScript helpers utility
|
|
76
|
+
*/
|
|
77
|
+
TS: Code.TS;
|
|
78
|
+
}
|
|
79
|
+
const TS: Code.TS;
|
|
80
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare namespace AVStantso {
|
|
2
|
+
namespace Code {
|
|
3
|
+
namespace TS {
|
|
4
|
+
/**
|
|
5
|
+
* @summary Array utils
|
|
6
|
+
*/
|
|
7
|
+
interface Array {
|
|
8
|
+
/**
|
|
9
|
+
* @summary Create `Array.ToKey2Key` record
|
|
10
|
+
* @template A Array type
|
|
11
|
+
* @param arr Array
|
|
12
|
+
* @returns `Array.ToKey2Key` record
|
|
13
|
+
* @example
|
|
14
|
+
* const arr = ['x', 'y', 'z'] as const;
|
|
15
|
+
* const rec = TS.Array.ToKey2Key(arr);
|
|
16
|
+
* expect(rec).toStrictEqual({ x: 'x', y: 'y', z: 'z' });
|
|
17
|
+
*/
|
|
18
|
+
ToKey2Key<A extends AVStantso.TS.ArrR>(arr: A): AVStantso.TS.Array.ToKey2Key<A>;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
interface TS {
|
|
22
|
+
/**
|
|
23
|
+
* @summary Array utils
|
|
24
|
+
*/
|
|
25
|
+
Array: TS.Array;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
declare namespace AVStantso.TS {
|
|
2
|
+
/**
|
|
3
|
+
* @summary Any array on `N` optional items.\
|
|
4
|
+
* ⚠ Please use for check, not for define\
|
|
5
|
+
* `998` is empiric max length
|
|
6
|
+
* @example
|
|
7
|
+
* type unlim0 = CheckType<Arr extends ArrN ? true : false, false>;
|
|
8
|
+
* type unlim1 = CheckType<number[] extends ArrN ? true : false, false>;
|
|
9
|
+
* type unlim2 = CheckType<string[] extends ArrN ? true : false, false>;
|
|
10
|
+
*
|
|
11
|
+
* type lim0 = CheckType<[] extends ArrN ? true : false, true>;
|
|
12
|
+
* type lim1 = CheckType<[number] extends ArrN ? true : false, true>;
|
|
13
|
+
* type lim2 = CheckType<[number, never, undefined] extends ArrN ? true : false, true>;
|
|
14
|
+
*/
|
|
15
|
+
type ArrN = readonly [...Array.Create.Optional<998, any>];
|
|
16
|
+
/**
|
|
17
|
+
* @summary Array of `N` items or [`M`]ore.\
|
|
18
|
+
* `998` is empiric max length for `N`
|
|
19
|
+
*/
|
|
20
|
+
type ArrM<T = any, N extends number = 2> = [...Array.Create<N, T>, ...T[]];
|
|
21
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
declare namespace AVStantso.TS.Array {
|
|
2
|
+
type _Create<L extends number, Item, Opt extends boolean, R extends Item[] = [], I extends number = 0> = I extends L ? R : _Create<L, Item, Opt, Opt extends true ? [...R, Item?] : [...R, Item], Increment<I>>;
|
|
3
|
+
/**
|
|
4
|
+
* @summary Creates array of `Item` with specified length `L`
|
|
5
|
+
* @template L Length
|
|
6
|
+
* @template Item Item type
|
|
7
|
+
* @returns `[Item × L]`
|
|
8
|
+
* @example
|
|
9
|
+
* type n = CheckType<Create<never, any>, never>;
|
|
10
|
+
* type u = CheckType<Create<undefined, any>, never>;
|
|
11
|
+
*
|
|
12
|
+
* type a5x3 = CheckType<Create<5, 3>, [3, 3, 3, 3, 3]>;
|
|
13
|
+
* type a2xABC = CheckType<Create<2, 'ABC'>, ['ABC', 'ABC']>;
|
|
14
|
+
*/
|
|
15
|
+
export type Create<L extends number, Item> = L extends undefined ? never : _Create<L, Item, false>;
|
|
16
|
+
export namespace Create {
|
|
17
|
+
/**
|
|
18
|
+
* @summary Create array of optional `Item` with specified length `L`
|
|
19
|
+
* @template L Length
|
|
20
|
+
* @template Item Item type
|
|
21
|
+
* @returns `[Item? × L]`
|
|
22
|
+
* @example
|
|
23
|
+
* type n = CheckType<Optional<never, any>, never>;
|
|
24
|
+
* type u = CheckType<Optional<undefined, any>, never>;
|
|
25
|
+
*
|
|
26
|
+
* type a5x3 = CheckType<Optional<5, 3>, [3?, 3?, 3?, 3?, 3?]>;
|
|
27
|
+
* type a2xABC = CheckType<Optional<2, 'ABC'>, ['ABC'?, 'ABC'?]>;
|
|
28
|
+
*/
|
|
29
|
+
type Optional<L extends number, Item> = L extends undefined ? never : _Create<L, Item, true>;
|
|
30
|
+
}
|
|
31
|
+
type _Numbers<L extends number, R extends number[] = [], I extends number = 0> = L extends I ? R : _Numbers<L, [...R, I], Increment<I>>;
|
|
32
|
+
/**
|
|
33
|
+
* @summary Creates numeric literals array.
|
|
34
|
+
* @template L Length
|
|
35
|
+
* @returns Numeric literals array
|
|
36
|
+
* @example
|
|
37
|
+
* type n = CheckType<Numbers<never>, never>;
|
|
38
|
+
* type u = CheckType<Numbers<undefined>, never>;
|
|
39
|
+
*
|
|
40
|
+
* type a0 = CheckType<Numbers<0>, []>;
|
|
41
|
+
* type a3 = CheckType<Numbers<3>, [0, 1, 2]>;
|
|
42
|
+
*/
|
|
43
|
+
export type Numbers<L extends number> = L extends undefined ? never : _Numbers<L>;
|
|
44
|
+
type _Letters<L extends number, R extends string[] = [], I extends number = 0> = L extends I ? R : _Letters<L, [...R, TS.Letters[I]], Increment<I>>;
|
|
45
|
+
/**
|
|
46
|
+
* @summary Creates letters literals array with length `L`
|
|
47
|
+
* @template L Length
|
|
48
|
+
* @returns Letters literals array
|
|
49
|
+
* @example
|
|
50
|
+
* type n = CheckType<Letters<never>, never>;
|
|
51
|
+
* type u = CheckType<Letters<undefined>, never>;
|
|
52
|
+
*
|
|
53
|
+
* type a0 = CheckType<Letters<0>, []>;
|
|
54
|
+
* type a3 = CheckType<Letters<3>, ['A', 'B', 'C']>;
|
|
55
|
+
* type a26 = CheckType<Letters<26>, TS.Letters>;
|
|
56
|
+
*/
|
|
57
|
+
export type Letters<L extends number> = L extends undefined ? never : _Letters<L>;
|
|
58
|
+
export {};
|
|
59
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
declare namespace AVStantso.TS.Array {
|
|
2
|
+
/**
|
|
3
|
+
* @summary Create array type with addition if not exists.
|
|
4
|
+
* @template TArr Array type
|
|
5
|
+
* @template Item Item to add
|
|
6
|
+
* @returns New array type with addition
|
|
7
|
+
* @example
|
|
8
|
+
* type n0 = CheckType<AddUnique<never, any>, never>;
|
|
9
|
+
* type n1 = CheckType<AddUnique<any, never>, never>;
|
|
10
|
+
*
|
|
11
|
+
* type u0 = CheckType<AddUnique<undefined, any>, never>;
|
|
12
|
+
*
|
|
13
|
+
* type t = CheckType<AddUnique<[2, 3], 1>, [2, 3, 1]>;
|
|
14
|
+
* type f = CheckType<AddUnique<[1, 2, 3], 1>, [1, 2, 3]>;
|
|
15
|
+
* type tu = CheckType<AddUnique<[1, 2, 3], undefined>, [1, 2, 3, undefined]>;
|
|
16
|
+
* type rtu = CheckType<AddUnique<readonly [1, 2, 3], undefined>, [1, 2, 3, undefined]>;
|
|
17
|
+
*/
|
|
18
|
+
export type AddUnique<TArr extends ArrR, Item> = TArr extends undefined ? never : [Item] extends [never] ? never : IfHasItem<TArr, Item> extends false ? [...TArr, Item] : TArr;
|
|
19
|
+
type _MergeUnique<TArr1 extends ArrR, TArr2 extends ArrR> = TArr2 extends readonly [infer F, ...infer Rest] ? _MergeUnique<IfHasItem<TArr1, F> extends true ? TArr1 : [...TArr1, F], Rest> : TArr1;
|
|
20
|
+
/**
|
|
21
|
+
* @summary Create merged array type from two arrays without duplicates from `TArr2`.
|
|
22
|
+
* @template TArr1 Array type
|
|
23
|
+
* @template TArr2 Array type
|
|
24
|
+
* @returns New merged array without duplicates from `TArr2`
|
|
25
|
+
* @example
|
|
26
|
+
* type n0 = CheckType<MergeUnique<never, any>, never>;
|
|
27
|
+
* type n1 = CheckType<MergeUnique<any, never>, never>;
|
|
28
|
+
*
|
|
29
|
+
* type u0 = CheckType<MergeUnique<undefined, any>, never>;
|
|
30
|
+
* type u1 = CheckType<MergeUnique<any, undefined>, never>;
|
|
31
|
+
*
|
|
32
|
+
* type A = CheckType<MergeUnique<[6, 1, 4], [1, 2, 3, 1, 4, 2, 5]>, [6, 1, 4, 2, 3, 5]>;
|
|
33
|
+
* type AU = CheckType<
|
|
34
|
+
* MergeUnique<[6, 1, 4], [1, 2, undefined, 1, 4, 2, undefined]>,
|
|
35
|
+
* [6, 1, 4, 2, undefined]
|
|
36
|
+
* >;
|
|
37
|
+
* type rAU = CheckType<
|
|
38
|
+
* MergeUnique<readonly [6, 1, 4], readonly [1, 2, undefined, 1, 4, 2, undefined]>,
|
|
39
|
+
* [6, 1, 4, 2, undefined]
|
|
40
|
+
* >;
|
|
41
|
+
*/
|
|
42
|
+
export type MergeUnique<TArr1 extends ArrR, TArr2 extends ArrR> = TArr1 extends undefined ? never : TArr2 extends undefined ? never : TArr1 extends ArrN ? TArr2 extends ArrN ? _MergeUnique<TArr1, TArr2> : never : never;
|
|
43
|
+
export namespace Filter {
|
|
44
|
+
type _Unique<TArr extends ArrR, R extends Arr = []> = TArr extends readonly [infer F, ...infer Rest] ? _Unique<Rest, IfHasItem<R, F> extends true ? R : [...R, F]> : R;
|
|
45
|
+
/**
|
|
46
|
+
* @summary Create array type from array without duplicates.
|
|
47
|
+
* @template TArr Array type
|
|
48
|
+
* @returns New array without duplicates
|
|
49
|
+
* @example
|
|
50
|
+
* type n = CheckType<Filter.Unique<never>, never>;
|
|
51
|
+
* type u = CheckType<Filter.Unique<undefined>,never>;
|
|
52
|
+
*
|
|
53
|
+
* type A = CheckType<Filter.Unique<[1, 2, 3, 1, 4, 2, 5]>, [1, 2, 3, 4, 5]>;
|
|
54
|
+
* type AU = CheckType<
|
|
55
|
+
* Filter.Unique<[1, 2, 3, undefined, 1, 4, undefined, 5]>,
|
|
56
|
+
* [1, 2, 3, undefined, 4, 5]
|
|
57
|
+
* >;
|
|
58
|
+
* type rAU = CheckType<
|
|
59
|
+
* Filter.Unique<readonly [1, 2, 3, undefined, 1, 4, undefined, 5]>,
|
|
60
|
+
* [1, 2, 3, undefined, 4, 5]
|
|
61
|
+
* >;
|
|
62
|
+
*/
|
|
63
|
+
export type Unique<TArr extends ArrR> = TArr extends undefined ? never : TArr extends ArrN ? _Unique<TArr> : never;
|
|
64
|
+
export {};
|
|
65
|
+
}
|
|
66
|
+
type _Filter<TArr extends ArrR, TFArr extends ArrR, R extends Arr = []> = TArr extends readonly [infer F, ...infer Rest] ? _Filter<Rest, TFArr, IfHasItem<TFArr, F> extends true ? R : [...R, F]> : R;
|
|
67
|
+
/**
|
|
68
|
+
* @summary Create array type from array without items from filter.
|
|
69
|
+
* @template TArr Array type
|
|
70
|
+
* @template TFilter Array of items or one item to exclude. Default filter `undefined` values
|
|
71
|
+
* @returns New filtered array
|
|
72
|
+
* @example
|
|
73
|
+
* type n0 = CheckType<Filter<never, any>, never>;
|
|
74
|
+
* type n1 = CheckType<Filter<any, never>, never>;
|
|
75
|
+
* type u0 = CheckType<Filter<undefined, any>, never>;
|
|
76
|
+
* type u1 = CheckType<Filter<any, undefined>, [] | [unknown]>;
|
|
77
|
+
*
|
|
78
|
+
* type A = CheckType<Filter<[1, 2, 3, 1, 4, 2, 5], 1>, [2, 3, 4, 2, 5]>;
|
|
79
|
+
* type AU = CheckType<
|
|
80
|
+
* Filter<[1, 2, 3, undefined, 1, 4, undefined, 5], [2, 3, undefined]>,
|
|
81
|
+
* [1, 1, 4, 5]
|
|
82
|
+
* >;
|
|
83
|
+
* type rAU = CheckType<
|
|
84
|
+
* Filter<readonly [1, 2, 3, undefined, 1, 4, undefined, 5], readonly [4, undefined]>,
|
|
85
|
+
* [1, 2, 3, 1, 5]
|
|
86
|
+
* >;
|
|
87
|
+
* type AUd = CheckType<
|
|
88
|
+
* Filter<[1, 2, 3, undefined, 1, 4, undefined, 5]>,
|
|
89
|
+
* [1, 2, 3, 1, 4, 5]
|
|
90
|
+
* >;
|
|
91
|
+
*/
|
|
92
|
+
export type Filter<TArr extends ArrR, TFilter = undefined> = TArr extends undefined ? never : TArr extends ArrN ? TFilter extends undefined ? _Filter<TArr, [TFilter]> : TFilter extends ArrN ? _Filter<TArr, TFilter> : _Filter<TArr, [TFilter]> : never;
|
|
93
|
+
export namespace Filter {
|
|
94
|
+
}
|
|
95
|
+
type _Sub<TArr extends ArrR, Start extends number, End extends number, I extends number = 0, R extends Arr = [], Ignore extends boolean = I extends Start ? false : true> = TArr extends readonly [infer F, ...infer Rest] ? I extends End ? R : Ignore extends true ? _Sub<Rest, Start, End, Increment<I>, R> : _Sub<Rest, Start, End, Increment<I>, [...R, F], false> : R;
|
|
96
|
+
type _SubCheck<TArr extends ArrR, Start extends number, End extends number, S extends number = Start extends undefined ? 0 : Numeric.IsNegative<Start, 0, Start>> = End extends undefined ? _Sub<TArr, S, End> : GT<S, Increment<End>> extends true ? never : _Sub<TArr, S, Increment<End>>;
|
|
97
|
+
/**
|
|
98
|
+
* @summary Create sub array type.
|
|
99
|
+
* @template TArr Array type
|
|
100
|
+
* @template Start Start index for copy. `undefined` or negative — from start of array
|
|
101
|
+
* @template End End index for copy. `undefined` — to end of array
|
|
102
|
+
* @returns Array type with copied items types or `never` if `Start > End`
|
|
103
|
+
* @example
|
|
104
|
+
* type n0 = CheckType<Sub<never, any>, never>;
|
|
105
|
+
* type n1 = CheckType<Sub<any, never>, never>;
|
|
106
|
+
* type n2 = CheckType<Sub<any, any, never>, never>;
|
|
107
|
+
* type u = CheckType<Sub<undefined, any>, never>;
|
|
108
|
+
*
|
|
109
|
+
* type A = CheckType<Sub<[1, 2, 3, undefined, 5, 6], 2, 4>, [3, undefined, 5]>;
|
|
110
|
+
* type S = CheckType<Sub<[1, 2, 3, 4, 5, 6], undefined, undefined>, [1, 2, 3, 4, 5, 6]>;
|
|
111
|
+
*
|
|
112
|
+
* type negaiveS = CheckType<Sub<[1, 2, 3, 4, 5, 6], -2, 4>, [1, 2, 3, 4, 5]>;
|
|
113
|
+
* type EltS = CheckType<Sub<[1, 2, 3, 4, 5, 6], 4, 2>, never>;
|
|
114
|
+
* type rEltS = CheckType<Sub<readonly [1, 2, 3, 4, 5, 6], 4, 2>, never>;
|
|
115
|
+
*/
|
|
116
|
+
export type Sub<TArr extends ArrR, Start extends number = undefined, End extends number = undefined> = TArr extends undefined ? never : [Start] extends [never] ? never : [End] extends [never] ? never : Start | End extends undefined ? TArr : TArr extends ArrN ? _SubCheck<TArr, Start, End> : never;
|
|
117
|
+
type _Remove<TArr extends ArrR, Start extends number, End extends number, S extends number = Start extends undefined ? 0 : Numeric.IsNegative<Start, 0, Start>, E extends number = End extends undefined ? undefined : GT<S, End, never, End>> = [E] extends [never] ? never : E extends undefined ? Sub<TArr, 0, Decrement<S>> : [...Sub<TArr, 0, Decrement<S>>, ...Sub<TArr, Increment<E>>];
|
|
118
|
+
/**
|
|
119
|
+
* @summary Create new array type witout removed section.
|
|
120
|
+
* @template TArr Array type
|
|
121
|
+
* @template Start Start index for remove. `undefined` or negative — from start of array
|
|
122
|
+
* @template End End index for remove. `undefined` — to end of array
|
|
123
|
+
* @returns Array type with copied items types, except removed items or `never` if `Start > End`
|
|
124
|
+
* @example
|
|
125
|
+
* type n0 = CheckType<Remove<never, any>, never>;
|
|
126
|
+
* type n1 = CheckType<Remove<any, never>, never>;
|
|
127
|
+
* type n2 = CheckType<Remove<any, any, never>, never>;
|
|
128
|
+
* type u = CheckType<Remove<undefined, any>, never>;
|
|
129
|
+
*
|
|
130
|
+
* type A = CheckType<Remove<[1, 2, 3, 4, 5, 6], 2, 4>, [1, 2, 6]>;
|
|
131
|
+
* type S = CheckType<Remove<[1, 2, 3, 4, 5, 6], undefined, undefined>, []>;
|
|
132
|
+
*
|
|
133
|
+
* type negaiveS = CheckType<Remove<[1, 2, 3, 4, 5, 6], -2, 4>, [6]>;
|
|
134
|
+
* type EltS = CheckType<Remove<[1, 2, 3, 4, 5, 6], 4, 2>, never>;
|
|
135
|
+
*
|
|
136
|
+
* type U = CheckType<Remove<[1, 2, 3, undefined, 5, undefined], 2, 4>, [1, 2, undefined]>;
|
|
137
|
+
* type rU = CheckType<
|
|
138
|
+
* Remove<readonly [1, 2, 3, undefined, 5, undefined], 2, 4>,
|
|
139
|
+
* [1, 2, undefined]
|
|
140
|
+
* >;
|
|
141
|
+
*/
|
|
142
|
+
export type Remove<TArr extends ArrR, Start extends number, End extends number = undefined> = TArr extends undefined ? never : [Start] extends [never] ? never : [End] extends [never] ? never : Start | End extends undefined ? [] : _Remove<TArr, Start extends undefined ? 0 : Start, End>;
|
|
143
|
+
/**
|
|
144
|
+
* @summary Reverse `TArr` array type. ⚠ Unsafe, internal
|
|
145
|
+
* @template TArr Array to reverse
|
|
146
|
+
* @returns Reversed array
|
|
147
|
+
* @example
|
|
148
|
+
* type n = CheckType<_Reverse<never>, never>;
|
|
149
|
+
* type u = CheckType<_Reverse<undefined>, [unknown]>; // ⚠
|
|
150
|
+
*
|
|
151
|
+
* type a0 = CheckType<_Reverse<[1, 2, 3]>, [3, 2, 1]>;
|
|
152
|
+
* type a2 = CheckType<_Reverse<[1, undefined, 3, 'a']>, ['a', 3, undefined, 1]>;
|
|
153
|
+
* type ra2 = CheckType<_Reverse<readonly [1, undefined, 3, 'a']>, ['a', 3, undefined, 1]>;
|
|
154
|
+
*/
|
|
155
|
+
export type _Reverse<TArr extends ArrR, R extends Arr = []> = TArr extends readonly [infer F, ...infer Rest] ? _Reverse<Rest, [F, ...R]> : R;
|
|
156
|
+
/**
|
|
157
|
+
* @summary Reverse `TArr` array type.
|
|
158
|
+
* @template TArr Array to reverse
|
|
159
|
+
* @returns Reversed array
|
|
160
|
+
* @example
|
|
161
|
+
* type n = CheckType<Reverse<never>, never>;
|
|
162
|
+
* type u = CheckType<Reverse<undefined>, never>;
|
|
163
|
+
*
|
|
164
|
+
* type a0 = CheckType<Reverse<[1, 2, 3]>, [3, 2, 1]>;
|
|
165
|
+
* type a2 = CheckType<Reverse<[1, undefined, 3, 'a']>, ['a', 3, undefined, 1]>;
|
|
166
|
+
* type ra2 = CheckType<Reverse<readonly [1, undefined, 3, 'a']>, ['a', 3, undefined, 1]>;
|
|
167
|
+
*/
|
|
168
|
+
export type Reverse<TArr extends ArrR> = TArr extends undefined ? never : TArr extends ArrN ? _Reverse<TArr> : never;
|
|
169
|
+
/**
|
|
170
|
+
* @summary Join `TArr` array type to `string`. ⚠ Unsafe, internal
|
|
171
|
+
* @template TArr Array to join
|
|
172
|
+
* @returns Joined string
|
|
173
|
+
* @example
|
|
174
|
+
* type n = CheckType<_Join<never>, never>;
|
|
175
|
+
* type u = CheckType<_Join<undefined>, string>; // ⚠
|
|
176
|
+
*
|
|
177
|
+
* type nn = CheckType<_Join<[1, 2, 3]>, '123'>;
|
|
178
|
+
* type rss = CheckType<_Join<readonly ['a', 1, true, 123456789012345]>, 'a1true123456789012345'>;
|
|
179
|
+
*/
|
|
180
|
+
export type _Join<TArr extends readonly (TS.String.Possible)[], R extends string = ''> = TArr extends readonly [
|
|
181
|
+
infer F extends TS.String.Possible,
|
|
182
|
+
...infer Rest extends (TS.String.Possible)[]
|
|
183
|
+
] ? _Join<Rest, `${R}${F}`> : R;
|
|
184
|
+
/**
|
|
185
|
+
* @summary Join `TArr` array type to `string`
|
|
186
|
+
* @template TArr Array to join
|
|
187
|
+
* @returns Joined string
|
|
188
|
+
* @example
|
|
189
|
+
* type n = CheckType<Join<never>, never>;
|
|
190
|
+
* type u = CheckType<Join<undefined>, undefined>;
|
|
191
|
+
*
|
|
192
|
+
* type nn = CheckType<Join<[1, 2, 3]>, '123'>;
|
|
193
|
+
* type rss = CheckType<Join<readonly ['a', 1, true, 123456789012345]>, 'a1true123456789012345'>;
|
|
194
|
+
*/
|
|
195
|
+
export type Join<TArr extends readonly (TS.String.Possible)[]> = TArr extends undefined ? TArr : TArr extends ArrN ? _Join<TArr> : never;
|
|
196
|
+
/**
|
|
197
|
+
* @summary Cast all `TArr` items to `Item` type. ⚠ Unsafe, internal
|
|
198
|
+
* @template TArr Array to cast
|
|
199
|
+
* @template Item Item type to cast. Defaults `any`
|
|
200
|
+
* @returns Array of `Extract<TArr[I], Item>`
|
|
201
|
+
* @example
|
|
202
|
+
* type n = CheckType<_Cast<never, any>, never>;
|
|
203
|
+
* type u = CheckType<_Cast<undefined, any>, [unknown]>; // ⚠
|
|
204
|
+
*
|
|
205
|
+
* type a0 = CheckType<_Cast<[1, 2, 3]>, [1, 2, 3]>;
|
|
206
|
+
* type a1 = CheckType<_Cast<[1, 2, 3], number>, [1, 2, 3]>;
|
|
207
|
+
* type a2 = CheckType<_Cast<[1, 2, 3], string>, [never, never, never]>;
|
|
208
|
+
* type a3 = CheckType<_Cast<[1, undefined, 3], string>, [never, undefined, never]>;
|
|
209
|
+
* type ra3 = CheckType<_Cast<readonly [1, undefined, 3], string>, [never, undefined, never]>;
|
|
210
|
+
*/
|
|
211
|
+
export type _Cast<TArr extends ArrR, Item = any, R extends Item[] = []> = TArr extends readonly [infer F, ...infer Rest] ? _Cast<Rest, Item, [...R, Extract<F, Item>]> : R;
|
|
212
|
+
/**
|
|
213
|
+
* @summary Cast all `TArr` items to `Item` type.
|
|
214
|
+
* @template TArr Array to cast
|
|
215
|
+
* @template Item Item type to cast. Defaults `any`
|
|
216
|
+
* @returns Array of `Extract<TArr[I], Item>`
|
|
217
|
+
* @example
|
|
218
|
+
* type n = CheckType<Cast<never, any>, never>;
|
|
219
|
+
* type u = CheckType<Cast<undefined, any>, never>;
|
|
220
|
+
*
|
|
221
|
+
* type a0 = CheckType<Cast<[1, 2, 3]>, [1, 2, 3]>;
|
|
222
|
+
* type a1 = CheckType<Cast<[1, 2, 3], number>, [1, 2, 3]>;
|
|
223
|
+
* type a2 = CheckType<Cast<[1, 2, 3], string>, [never, never, never]>;
|
|
224
|
+
* type a3 = CheckType<Cast<[1, undefined, 3], string>, [never, undefined, never]>;
|
|
225
|
+
* type ra3 = CheckType<Cast<readonly [1, undefined, 3], string>, [never, undefined, never]>;
|
|
226
|
+
*/
|
|
227
|
+
export type Cast<TArr extends ArrR, Item = any> = TArr extends undefined ? never : TArr extends ArrN ? _Cast<TArr, Item> : never;
|
|
228
|
+
export {};
|
|
229
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
declare namespace AVStantso.TS.Array {
|
|
2
|
+
type _IndexOf<TArr extends ArrR, Item, I extends number = 0> = TArr extends readonly [infer F, ...infer Rest] ? Extends<F, Item> extends true ? I : _IndexOf<Rest, Item, Increment<I>> : undefined;
|
|
3
|
+
/**
|
|
4
|
+
* @summary Find index of type in array type.
|
|
5
|
+
* @template TArr Tested array type
|
|
6
|
+
* @template Item Tested item type
|
|
7
|
+
* @template I Start index
|
|
8
|
+
* @returns Number literal or `undefined` if not found
|
|
9
|
+
* @example
|
|
10
|
+
* type n0 = CheckType<IndexOf<never, any, any>, never>;
|
|
11
|
+
* type n1 = CheckType<IndexOf<any, never, any>, never>;
|
|
12
|
+
* type n2 = CheckType<IndexOf<any, any, never>, never>;
|
|
13
|
+
*
|
|
14
|
+
* type u0 = CheckType<IndexOf<undefined, any, any>, never>;
|
|
15
|
+
* type u1 = CheckType<IndexOf<any, any, undefined>, never>;
|
|
16
|
+
*
|
|
17
|
+
* type et = CheckType<IndexOf<readonly [1, 2, 3], 2>, 1>;
|
|
18
|
+
* type etu = CheckType<IndexOf<[undefined, undefined, 'x'], undefined>, 0>;
|
|
19
|
+
* type eu = CheckType<IndexOf<[undefined, undefined, 'x'], 'x'>, 2>;
|
|
20
|
+
* type es = CheckType<IndexOf<[undefined, undefined, 'x'], string>, 2>;
|
|
21
|
+
* type ef = CheckType<IndexOf<[1, 2, 3], 4>, undefined>;
|
|
22
|
+
*/
|
|
23
|
+
export type IndexOf<TArr extends ArrR, Item, I extends number = 0> = TArr extends undefined ? never : [Item] extends [never] ? never : I extends undefined ? never : TArr extends ArrN ? _IndexOf<TArr, Item, I> : never;
|
|
24
|
+
type _IfHasItem<TArr extends ArrR, Item, IfTrue = true, IfFalse = false, I extends number = IndexOf<TArr, Item>> = [I] extends [never] ? never : I extends undefined ? IfFalse : IfTrue;
|
|
25
|
+
/**
|
|
26
|
+
* @summary Test array type has item.
|
|
27
|
+
* @template TArr Tested array type
|
|
28
|
+
* @template Item Tested item type
|
|
29
|
+
* @template IfTrue Result, if `TArr` has `Item`
|
|
30
|
+
* @template IfFalse Result, if `TArr` NOT has `Item`
|
|
31
|
+
* @returns `IfFalse` or `IfTrue` param
|
|
32
|
+
* @example
|
|
33
|
+
* type n0 = CheckType<IfHasItem<never, any>, never>;
|
|
34
|
+
* type n1 = CheckType<IfHasItem<any, never>, never>;
|
|
35
|
+
*
|
|
36
|
+
* type u0 = CheckType<IfHasItem<undefined, any>, never>;
|
|
37
|
+
*
|
|
38
|
+
* type e = CheckType<IfHasItem<[1, 2, 3], 2>, true>;
|
|
39
|
+
* type n = CheckType<IfHasItem<[1, 2, 3], 4>, false>;
|
|
40
|
+
* type eu = CheckType<IfHasItem<[1, undefined, 3, 4], 4>, true>;
|
|
41
|
+
* type euu = CheckType<IfHasItem<[1, undefined, 3, 4], undefined>, true>;
|
|
42
|
+
* type reuu = CheckType<IfHasItem<readonly [1, undefined, 3, 4], undefined>, true>;
|
|
43
|
+
*/
|
|
44
|
+
export type IfHasItem<TArr extends ArrR, Item, IfTrue = true, IfFalse = false> = _IfHasItem<TArr, Item, IfTrue, IfFalse>;
|
|
45
|
+
type _IfEach<TArr extends ArrR, Item, IfTrue = true, IfFalse = false, I extends number = 0> = TArr extends readonly [infer F, ...infer Rest] ? Extends<F, Item> extends true ? _IfEach<Rest, Item, IfTrue, IfFalse, Increment<I>> : IfFalse : IfTrue;
|
|
46
|
+
/**
|
|
47
|
+
* @summary Test array type each item extends `Item`.
|
|
48
|
+
* @template TArr Tested array type
|
|
49
|
+
* @template Item Tested item type
|
|
50
|
+
* @template IfTrue Result, if each item of `TArr` extends `Item`
|
|
51
|
+
* @template IfFalse Result, if NOT each item of `TArr` extends `Item`
|
|
52
|
+
* @returns `IfFalse` or `IfTrue` param
|
|
53
|
+
* @example
|
|
54
|
+
* type n0 = CheckType<IfEach<never, any>, never>;
|
|
55
|
+
* type n1 = CheckType<IfEach<any, never>, never>;
|
|
56
|
+
*
|
|
57
|
+
* type u0 = CheckType<IfEach<undefined, any>, never>;
|
|
58
|
+
*
|
|
59
|
+
* type t = CheckType<IfEach<[2, 2, 2], 2>, true>;
|
|
60
|
+
* type f = CheckType<IfEach<[1, 2, 3], 3>, false>;
|
|
61
|
+
*
|
|
62
|
+
* type fu = CheckType<IfEach<[undefined, undefined, 3], 3>, false>;
|
|
63
|
+
* type tu = CheckType<IfEach<[undefined, undefined, undefined], undefined>, true>;
|
|
64
|
+
* type rtu = CheckType<IfEach<readonly [undefined, undefined, undefined], undefined>, true>;
|
|
65
|
+
*/
|
|
66
|
+
export type IfEach<TArr extends ArrR, Item, IfTrue = true, IfFalse = false> = TArr extends undefined ? never : [Item] extends [never] ? never : TArr extends ArrN ? _IfEach<TArr, Item, IfTrue, IfFalse> : never;
|
|
67
|
+
type _CountOf<TArr extends ArrR, Item, R extends number = 0> = TArr extends readonly [infer F, ...infer Rest] ? _CountOf<Rest, Item, Extends<F, Item, Increment<R>, R>> : R;
|
|
68
|
+
/**
|
|
69
|
+
* @summary Calculate count of items who extends `Item` in array `TArr`.
|
|
70
|
+
* @template TArr Tested array type
|
|
71
|
+
* @template Item Tested item type
|
|
72
|
+
* @returns Count of items who extends `Item` in array
|
|
73
|
+
* @example
|
|
74
|
+
* type n0 = CheckType<CountOf<never, any>, never>;
|
|
75
|
+
* type n1 = CheckType<CountOf<any, never>, never>;
|
|
76
|
+
*
|
|
77
|
+
* type u0 = CheckType<CountOf<undefined, any>, never>;
|
|
78
|
+
*
|
|
79
|
+
* type r0 = CheckType<CountOf<[1, 2, 3], 4>, 0>;
|
|
80
|
+
* type r1 = CheckType<CountOf<[1, 2, 3], 3>, 1>;
|
|
81
|
+
* type r3 = CheckType<CountOf<[2, 2, 2], 2>, 3>;
|
|
82
|
+
* type z0 = CheckType<CountOf<[], 4>, 0>;
|
|
83
|
+
*
|
|
84
|
+
* type cu = CheckType<CountOf<['z', undefined, undefined], undefined>, 2>;
|
|
85
|
+
* type rcu = CheckType<CountOf<readonly ['z', undefined, undefined], undefined>, 2>;
|
|
86
|
+
*/
|
|
87
|
+
export type CountOf<TArr extends ArrR, Item> = TArr extends undefined ? never : [Item] extends [never] ? never : TArr extends ArrN ? _CountOf<TArr, Item> : never;
|
|
88
|
+
export {};
|
|
89
|
+
}
|