-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
array.some.ts
67 lines (60 loc) · 1.95 KB
/
array.some.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import type { IsEqual } from '../equal/equal.js'
import type { CanAssign } from '../index.js'
import type { Tail } from '../tuple/tail.js'
import type { UnionOfValues } from './union_of_values.js'
/**
* Determines whether the array type `A` contains any elements that satisfies the specified `Criteria` type.
*
* It operates in `loose` mode by default,
* which means literal types satisfies their widened counterparts.
*
* You can also change it to `strict` mode.
*
* 🦴 *utilities*
*
* @example
* ```ts
* Some<string[], string> // true
* Some<['a', boolean], boolean> // true
* Some<['a', true], boolean> //true
*
* Some<['a', true], boolean, 'strict'> // false
* ```
*/
export type Some<
A extends readonly unknown[],
Criteria,
Mode extends 'strict' | 'loose' = 'loose',
Then = true,
Else = false
> = Mode extends 'strict' ? Some.Strict<A, Criteria, Then, Else> : Some.Loose<A, Criteria, Then, Else>
export namespace Some {
export type Strict<A extends readonly unknown[], Criteria, Then, Else> = number extends A['length']
? StrictArray<A, Criteria, Then, Else>
: StrictTuple<A, Criteria, Then, Else>
export type StrictArray<A extends readonly unknown[], Criteria, Then, Else> = IsEqual<
UnionOfValues<A>,
Criteria,
Then,
Else
>
export type StrictTuple<A extends readonly unknown[], Criteria, Then, Else> = A['length'] extends 0
? Else
: IsEqual<A[0], Criteria> extends true
? Then
: StrictTuple<Tail<A>, Criteria, Then, Else>
export type Loose<A extends readonly unknown[], Criteria, Then, Else> = number extends A['length']
? LooseArray<A, Criteria, Then, Else>
: LooseTuple<A, Criteria, Then, Else>
export type LooseArray<A extends readonly unknown[], Criteria, Then, Else> = CanAssign<
UnionOfValues<A>,
Criteria,
Then,
Else
>
export type LooseTuple<A extends readonly unknown[], Criteria, Then, Else> = A['length'] extends 0
? Else
: A[0] extends Criteria
? Then
: LooseTuple<Tail<A>, Criteria, Then, Else>
}