1
1
import type { IsNever } from '../is-never.d.ts' ;
2
- import type { NegativeInfinity , PositiveInfinity } from '../numeric.d.ts' ;
2
+ import type { Finite , NegativeInfinity , PositiveInfinity } from '../numeric.d.ts' ;
3
3
import type { UnknownArray } from '../unknown-array.d.ts' ;
4
4
import type { StringToNumber } from './string.d.ts' ;
5
+ import type { IsAnyOrNever } from './type.d.ts' ;
5
6
6
7
/**
7
8
Returns the absolute value of a given value.
@@ -33,19 +34,20 @@ type A = IsNumberLike<'1'>;
33
34
type B = IsNumberLike<'-1.1'>;
34
35
//=> true
35
36
36
- type C = IsNumberLike<1 >;
37
+ type C = IsNumberLike<'5e-20' >;
37
38
//=> true
38
39
39
- type D = IsNumberLike<'a'>;
40
+ type D = IsNumberLike<1>;
41
+ //=> true
42
+
43
+ type E = IsNumberLike<'a'>;
40
44
//=> false
41
45
*/
42
46
export type IsNumberLike < N > =
43
- N extends number ? true
44
- : N extends `${number } `
47
+ IsAnyOrNever < N > extends true ? N
48
+ : N extends number | `${number } `
45
49
? true
46
- : N extends `${number } .${number } `
47
- ? true
48
- : false ;
50
+ : false ;
49
51
50
52
/**
51
53
Returns the minimum number in the given union of numbers.
@@ -54,11 +56,25 @@ Note: Just supports numbers from 0 to 999.
54
56
55
57
@example
56
58
```
57
- type A = UnionMin<3 | 1 | 2>;
59
+ type A = UnionMin<1 | 3 | 2>;
58
60
//=> 1
61
+
62
+ type B = UnionMin<number>;
63
+ //=> number
64
+
65
+ type C = UnionMin<any>;
66
+ //=> any
67
+
68
+ type D = UnionMin<never>;
69
+ //=> never
59
70
```
60
71
*/
61
- export type UnionMin < N extends number > = InternalUnionMin < N > ;
72
+ export type UnionMin < N extends number > =
73
+ IsAnyOrNever < N > extends true ? N
74
+ : number extends N ? number
75
+ : NegativeInfinity extends N ? NegativeInfinity
76
+ : [ N ] extends [ PositiveInfinity ] ? PositiveInfinity
77
+ : InternalUnionMin < Finite < N > > ;
62
78
63
79
/**
64
80
The actual implementation of `UnionMin`. It's private because it has some arguments that don't need to be exposed.
@@ -77,17 +93,31 @@ Note: Just supports numbers from 0 to 999.
77
93
```
78
94
type A = UnionMax<1 | 3 | 2>;
79
95
//=> 3
96
+
97
+ type B = UnionMax<number>;
98
+ //=> number
99
+
100
+ type C = UnionMax<any>;
101
+ //=> any
102
+
103
+ type D = UnionMax<never>;
104
+ //=> never
80
105
```
81
106
*/
82
- export type UnionMax < N extends number > = InternalUnionMax < N > ;
107
+ export type UnionMax < N extends number > =
108
+ IsAnyOrNever < N > extends true ? N
109
+ : number extends N ? number
110
+ : PositiveInfinity extends N ? PositiveInfinity
111
+ : [ N ] extends [ NegativeInfinity ] ? NegativeInfinity
112
+ : InternalUnionMax < Finite < N > > ;
83
113
84
114
/**
85
115
The actual implementation of `UnionMax`. It's private because it has some arguments that don't need to be exposed.
86
116
*/
87
117
type InternalUnionMax < N extends number , T extends UnknownArray = [ ] > =
88
118
IsNever < N > extends true
89
119
? T [ 'length' ]
90
- : T [ 'length' ] extends N
120
+ : T [ 'length' ] extends N
91
121
? InternalUnionMax < Exclude < N , T [ 'length' ] > , T >
92
122
: InternalUnionMax < N , [ ...T , unknown ] > ;
93
123
0 commit comments