diff --git a/apps/website/public/favicon.svg b/apps/website/public/favicon.svg
index cba5ac140a..211ab02544 100644
--- a/apps/website/public/favicon.svg
+++ b/apps/website/public/favicon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+type-plus
\ No newline at end of file
diff --git a/apps/website/src/assets/type-plus.svg b/apps/website/src/assets/type-plus.svg
index 5e3e8949be..135c8103af 100644
--- a/apps/website/src/assets/type-plus.svg
+++ b/apps/website/src/assets/type-plus.svg
@@ -1,4 +1,5 @@
+ type-plus
tp
diff --git a/biome.json b/biome.json
index 1ab1207160..6b132046a5 100644
--- a/biome.json
+++ b/biome.json
@@ -9,7 +9,6 @@
},
"files": {
"includes": [
- "**",
"!**/.changeset/**/*.json",
"!**/.turbo",
"!**/.vscode/**/*.txt",
diff --git a/packages/type-plus/src/$type/branch/$resolve-branch.ts b/packages/type-plus/src/$type/branch/$resolve-branch.ts
index 7ff397a948..7b964c2ebb 100644
--- a/packages/type-plus/src/$type/branch/$resolve-branch.ts
+++ b/packages/type-plus/src/$type/branch/$resolve-branch.ts
@@ -25,11 +25,8 @@ export type $ResolveBranch<
? _<$O, B, $ResolveBranch<$O, Rest, D>>
: $InferError<'$Branches must have at least one entry'>
-type _<$O extends Record, $B, D> = $B extends $Branch
- ? $B[$Branch.$Key] extends keyof $O
- ? $O[$B[$Branch.$Key]]
- : D
- : D
+type _<$O extends Record, $B, D> =
+ $B extends $Branch ? ($B[$Branch.$Key] extends keyof $O ? $O[$B[$Branch.$Key]] : D) : D
type _Last<$O extends Record, $B, D> = $B extends $Then
? '$then' extends keyof $O
? $O['$then']
diff --git a/packages/type-plus/src/$type/distributive/$distributive.ts b/packages/type-plus/src/$type/distributive/$distributive.ts
index 300c8bf39f..78d228cda5 100644
--- a/packages/type-plus/src/$type/distributive/$distributive.ts
+++ b/packages/type-plus/src/$type/distributive/$distributive.ts
@@ -41,13 +41,12 @@ export namespace $Distributive {
/**
* Parse the options for `distributive`.
*/
- export type Parse<$Options extends Options, $O extends $InputOptions<$Then | $Else> = {}> = $ResolveOptions<
- [$Options['distributive'], Default['distributive']]
- > extends true
- ? '$then' extends keyof $O
- ? $O['$then']
- : true
- : '$else' extends keyof $O
- ? $O['$else']
- : false
+ export type Parse<$Options extends Options, $O extends $InputOptions<$Then | $Else> = {}> =
+ $ResolveOptions<[$Options['distributive'], Default['distributive']]> extends true
+ ? '$then' extends keyof $O
+ ? $O['$then']
+ : true
+ : '$else' extends keyof $O
+ ? $O['$else']
+ : false
}
diff --git a/packages/type-plus/src/$type/exact/$exact.ts b/packages/type-plus/src/$type/exact/$exact.ts
index d3f80e2cd3..46f610d823 100644
--- a/packages/type-plus/src/$type/exact/$exact.ts
+++ b/packages/type-plus/src/$type/exact/$exact.ts
@@ -41,13 +41,12 @@ export namespace $Exact {
/**
* Parse the options for `exact`.
*/
- export type Parse<$Options extends Options, $O extends $InputOptions<$Then | $Else> = {}> = $ResolveOptions<
- [$Options['exact'], Default['exact']]
- > extends true
- ? '$then' extends keyof $O
- ? $O['$then']
- : true
- : '$else' extends keyof $O
- ? $O['$else']
- : false
+ export type Parse<$Options extends Options, $O extends $InputOptions<$Then | $Else> = {}> =
+ $ResolveOptions<[$Options['exact'], Default['exact']]> extends true
+ ? '$then' extends keyof $O
+ ? $O['$then']
+ : true
+ : '$else' extends keyof $O
+ ? $O['$else']
+ : false
}
diff --git a/packages/type-plus/src/$type/fn/_fn-test.ts b/packages/type-plus/src/$type/fn/_fn-test.ts
index 5b65baae25..0e237a0020 100644
--- a/packages/type-plus/src/$type/fn/_fn-test.ts
+++ b/packages/type-plus/src/$type/fn/_fn-test.ts
@@ -6,8 +6,5 @@ import type { $Fn } from './$fn.js'
* `[R, true] extends [true, R]` holds only when `R` is `true` (or `any`):
* `boolean` fails the first position and `never` fails the second.
*/
-export type _FnTest = $Fn.Apply extends infer R
- ? [R, true] extends [true, R]
- ? true
- : false
- : never
+export type _FnTest =
+ $Fn.Apply extends infer R ? ([R, true] extends [true, R] ? true : false) : never
diff --git a/packages/type-plus/src/$type/utils/$strict-options.spec.ts b/packages/type-plus/src/$type/utils/$strict-options.spec.ts
index 4bbbd7768b..8b54611b21 100644
--- a/packages/type-plus/src/$type/utils/$strict-options.spec.ts
+++ b/packages/type-plus/src/$type/utils/$strict-options.spec.ts
@@ -93,9 +93,8 @@ describe('generic wrappers', () => {
})
it('can narrow with a conditional when it has no options of its own', () => {
- type Narrow = $O extends $StrictOptions<$O, IsObject.$Options>
- ? IsObject
- : never
+ type Narrow =
+ $O extends $StrictOptions<$O, IsObject.$Options> ? IsObject : never
testType.equal, true>(true)
testType.equal, { a: 1 }>(true)
@@ -150,12 +149,8 @@ describe('$ForwardOptions', () => {
})
it('is needed: narrowing without removing the wrapper option answers never', () => {
- type NoStrip = {}> = $O extends $StrictOptions<
- $O,
- IsObject.$Options
- >
- ? IsObject
- : never
+ type NoStrip = {}> =
+ $O extends $StrictOptions<$O, IsObject.$Options> ? IsObject : never
testType.equal, true>(true)
testType.equal, never>(true)
diff --git a/packages/type-plus/src/array/array-plus.drop-match.ts b/packages/type-plus/src/array/array-plus.drop-match.ts
index a32e145903..7c15c8969b 100644
--- a/packages/type-plus/src/array/array-plus.drop-match.ts
+++ b/packages/type-plus/src/array/array-plus.drop-match.ts
@@ -38,8 +38,5 @@ type _DropMatch>, Criteria> = A[0] extends Cri
? A
: Array>
-type _Fn>, F extends $Fn> = _Exclude extends infer R
- ? [R] extends [never]
- ? never[]
- : Array
- : never
+type _Fn>, F extends $Fn> =
+ _Exclude extends infer R ? ([R] extends [never] ? never[] : Array) : never
diff --git a/packages/type-plus/src/array/array-plus.element-match.ts b/packages/type-plus/src/array/array-plus.element-match.ts
index 2cb48cb0d0..32fa860271 100644
--- a/packages/type-plus/src/array/array-plus.element-match.ts
+++ b/packages/type-plus/src/array/array-plus.element-match.ts
@@ -77,11 +77,12 @@ type _ElementMatch = [T] extends
: C['$notMatch']
: never
-type _Fn = TypePlusOptions.Merge<
- $O,
- ElementMatch.$Default
-> extends infer C extends Record
- ? (T extends unknown ? (_FnTest extends true ? T : C['$notMatch']) : never) extends infer R
- ? IsUnion; $else: R }>
- : C['$notMatch']
- : never
+type _Fn =
+ TypePlusOptions.Merge<$O, ElementMatch.$Default> extends infer C extends Record<
+ keyof ElementMatch.$Options,
+ unknown
+ >
+ ? (T extends unknown ? (_FnTest extends true ? T : C['$notMatch']) : never) extends infer R
+ ? IsUnion; $else: R }>
+ : C['$notMatch']
+ : never
diff --git a/packages/type-plus/src/array/array-plus.filter.ts b/packages/type-plus/src/array/array-plus.filter.ts
index 851377f9dc..abfd1257dc 100644
--- a/packages/type-plus/src/array/array-plus.filter.ts
+++ b/packages/type-plus/src/array/array-plus.filter.ts
@@ -21,25 +21,22 @@ import type { TypePlusOptions } from '../utils/options.js'
* type R = ArrayPlus.Filter, IsObject.$Fn> // never[]
* ```
*/
-export type Filter<
- A extends readonly unknown[],
- Criteria = true,
- $O extends $StrictOptions<$O, Filter.$Options> = {},
-> = TypePlusOptions.Merge<$O, Filter.$Default> extends infer O extends Filter.$Options
- ? IsNever<
- A,
- {
- $then: O['$never']
- $else: [Criteria] extends [never]
- ? _Type
- : [Criteria] extends [infer F extends $Fn]
- ? number extends A['length']
- ? _Fn
- : O['$notArray']
- : _Type
- }
- >
- : never
+export type Filter = {}> =
+ TypePlusOptions.Merge<$O, Filter.$Default> extends infer O extends Filter.$Options
+ ? IsNever<
+ A,
+ {
+ $then: O['$never']
+ $else: [Criteria] extends [never]
+ ? _Type
+ : [Criteria] extends [infer F extends $Fn]
+ ? number extends A['length']
+ ? _Fn
+ : O['$notArray']
+ : _Type
+ }
+ >
+ : never
export namespace Filter {
export interface $Options extends $Never.$Options {
@@ -57,11 +54,8 @@ type _Type =
? Array
: O['$notArray']
-type _Fn = _Keep extends infer R
- ? [R] extends [never]
- ? never[]
- : Array
- : never
+type _Fn =
+ _Keep extends infer R ? ([R] extends [never] ? never[] : Array) : never
/**
* The members of `T` that the type function `F` matches.
diff --git a/packages/type-plus/src/array/at.ts b/packages/type-plus/src/array/at.ts
index 7e54efef77..9e1cc20007 100644
--- a/packages/type-plus/src/array/at.ts
+++ b/packages/type-plus/src/array/at.ts
@@ -26,37 +26,34 @@ import type { IndexAt } from './array-plus.index-at.js'
* type R = At // string | undefined
* ```
*/
-export type At<
- A extends readonly unknown[],
- N extends number,
- $O extends $StrictOptions<$O, At.$Options> = {},
-> = IndexAt<
- A,
- N,
- {
- $never: _ResolveFail<$O>
- $emptyTuple: _ResolveFail<$O>
- $upperBound: _ResolveFail<$O>
- $lowerBound: _ResolveFail<$O>
- }
-> extends infer I
- ? I extends number
- ? IsTuple.$<
- A,
- {
- $then: IsNumber.$<
- I,
- {
- exact: true
- $then: A[I] | undefined
- $else: A[I]
- }
- >
- $else: A[I] | undefined
- }
- >
- : _ResolveFail<$O>
- : never
+export type At = {}> =
+ IndexAt<
+ A,
+ N,
+ {
+ $never: _ResolveFail<$O>
+ $emptyTuple: _ResolveFail<$O>
+ $upperBound: _ResolveFail<$O>
+ $lowerBound: _ResolveFail<$O>
+ }
+ > extends infer I
+ ? I extends number
+ ? IsTuple.$<
+ A,
+ {
+ $then: IsNumber.$<
+ I,
+ {
+ exact: true
+ $then: A[I] | undefined
+ $else: A[I]
+ }
+ >
+ $else: A[I] | undefined
+ }
+ >
+ : _ResolveFail<$O>
+ : never
export namespace At {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/array/head.ts b/packages/type-plus/src/array/head.ts
index b7a428061c..2cf618e458 100644
--- a/packages/type-plus/src/array/head.ts
+++ b/packages/type-plus/src/array/head.ts
@@ -25,18 +25,16 @@ import type { TypePlusOptions } from '../utils/options.js'
* @typeParam $O['$emptyTuple'] Return type when `A` is `[]`.
* Default to `never`.
*/
-export type Head = {}> = IsNever<
- A,
- $Selection.Branch
-> extends infer R
- ? R extends $Then
- ? TypePlusOptions.Merge<$O, Head.$Default>['$never']
- : R extends $Else
- ? A['length'] extends 0
- ? TypePlusOptions.Merge<$O, Head.$Default>['$emptyTuple']
- : A[0]
- : never
- : never
+export type Head = {}> =
+ IsNever extends infer R
+ ? R extends $Then
+ ? TypePlusOptions.Merge<$O, Head.$Default>['$never']
+ : R extends $Else
+ ? A['length'] extends 0
+ ? TypePlusOptions.Merge<$O, Head.$Default>['$emptyTuple']
+ : A[0]
+ : never
+ : never
export namespace Head {
export interface $Options extends $Never.$Options {
diff --git a/packages/type-plus/src/array/last.ts b/packages/type-plus/src/array/last.ts
index 478539de31..f6d1d709b0 100644
--- a/packages/type-plus/src/array/last.ts
+++ b/packages/type-plus/src/array/last.ts
@@ -23,18 +23,16 @@ import type { TypePlusOptions } from '../utils/options.js'
* @typeParam $O['$emptyTuple'] Return type when `A` is `[]`.
* Default to `never`.
*/
-export type Last<
- A extends readonly unknown[],
- $O extends $StrictOptions<$O, Last.$Options> = {},
-> = TypePlusOptions.Merge<$O, Last.$Default> extends infer O extends Required
- ? IsNever<
- A,
- {
- $then: O['$never']
- $else: A['length'] extends 0 ? O['$emptyTuple'] : A extends readonly [...unknown[], infer R] ? R : A[0]
- }
- >
- : never
+export type Last = {}> =
+ TypePlusOptions.Merge<$O, Last.$Default> extends infer O extends Required
+ ? IsNever<
+ A,
+ {
+ $then: O['$never']
+ $else: A['length'] extends 0 ? O['$emptyTuple'] : A extends readonly [...unknown[], infer R] ? R : A[0]
+ }
+ >
+ : never
export namespace Last {
export interface $Options extends $Never.$Options {
diff --git a/packages/type-plus/src/array/slice.ts b/packages/type-plus/src/array/slice.ts
index fddf9cc399..8c5defe2ae 100644
--- a/packages/type-plus/src/array/slice.ts
+++ b/packages/type-plus/src/array/slice.ts
@@ -73,12 +73,8 @@ type _IndexKind = IsAny<
}
>
-type _Slice = GreaterThan<
- End,
- Start
-> extends true
- ? _Take
- : []
+type _Slice =
+ GreaterThan extends true ? _Take : []
type _Take<
A extends readonly unknown[],
diff --git a/packages/type-plus/src/bigint/is-bigint.ts b/packages/type-plus/src/bigint/is-bigint.ts
index 26d6042650..bbd9279723 100644
--- a/packages/type-plus/src/bigint/is-bigint.ts
+++ b/packages/type-plus/src/bigint/is-bigint.ts
@@ -127,9 +127,10 @@ export namespace IsBigint {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], $Exact.Default]> extends true
- ? $Distributive.Parse<$O, { $then: _SD; $else: _SN }>
- : Assignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], $Exact.Default]> extends true
+ ? $Distributive.Parse<$O, { $then: _SD; $else: _SN }>
+ : Assignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/bigint/is-not-bigint.ts b/packages/type-plus/src/bigint/is-not-bigint.ts
index 0818f2c1d9..b87a643872 100644
--- a/packages/type-plus/src/bigint/is-not-bigint.ts
+++ b/packages/type-plus/src/bigint/is-not-bigint.ts
@@ -126,9 +126,10 @@ export namespace IsNotBigint {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], false]> extends true
- ? $Distributive.Parse<$O, { $then: _SD; $else: _SN }>
- : NotAssignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? $Distributive.Parse<$O, { $then: _SD; $else: _SN }>
+ : NotAssignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/boolean/is-boolean.ts b/packages/type-plus/src/boolean/is-boolean.ts
index 0663aca45d..58f270f7f9 100644
--- a/packages/type-plus/src/boolean/is-boolean.ts
+++ b/packages/type-plus/src/boolean/is-boolean.ts
@@ -116,22 +116,24 @@ export namespace IsBoolean {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], $Exact.Default]> extends true
- ? $Distributive.Parse<$O, { $then: _SD; $else: _N }>
- : Assignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], $Exact.Default]> extends true
+ ? $Distributive.Parse<$O, { $then: _SD; $else: _N }>
+ : Assignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
-type _SD = _BooleanDistributeMap extends infer R
- ? ['aBcD' | 'AbCd' | 'abcd'] extends [R]
- ? $ResolveBranch<$O, [$Then], boolean> | $ResolveBranch<$O, [$Else], Exclude>
- : ['aBcD' | 'AbCd'] extends [R]
- ? $ResolveBranch<$O, [$Then], T>
- : ['aBcd' | 'Abcd'] extends [R]
+type _SD =
+ _BooleanDistributeMap extends infer R
+ ? ['aBcD' | 'AbCd' | 'abcd'] extends [R]
+ ? $ResolveBranch<$O, [$Then], boolean> | $ResolveBranch<$O, [$Else], Exclude>
+ : ['aBcD' | 'AbCd'] extends [R]
? $ResolveBranch<$O, [$Then], T>
- : $ResolveBranch<$O, [$Else]>
- : never
+ : ['aBcd' | 'Abcd'] extends [R]
+ ? $ResolveBranch<$O, [$Then], T>
+ : $ResolveBranch<$O, [$Else]>
+ : never
type _N = [T] extends [boolean]
? [T] extends [true]
diff --git a/packages/type-plus/src/boolean/is-not-boolean.ts b/packages/type-plus/src/boolean/is-not-boolean.ts
index e6e04c18ac..2dad29dd1e 100644
--- a/packages/type-plus/src/boolean/is-not-boolean.ts
+++ b/packages/type-plus/src/boolean/is-not-boolean.ts
@@ -119,22 +119,24 @@ export namespace IsNotBoolean {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], false]> extends true
- ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
- : NotAssignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
+ : NotAssignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
-type _D = _BooleanDistributeMap extends infer R
- ? ['aBcD' | 'AbCd' | 'abcd'] extends [R]
- ? $ResolveBranch<$O, [$Then | $Else], Exclude>
- : ['aBcD' | 'AbCd'] extends [R]
- ? $ResolveBranch<$O, [$Else]>
- : ['aBcd' | 'Abcd'] extends [R]
+type _D =
+ _BooleanDistributeMap extends infer R
+ ? ['aBcD' | 'AbCd' | 'abcd'] extends [R]
+ ? $ResolveBranch<$O, [$Then | $Else], Exclude>
+ : ['aBcD' | 'AbCd'] extends [R]
? $ResolveBranch<$O, [$Else]>
- : $ResolveBranch<$O, [$Then], T>
- : never
+ : ['aBcd' | 'Abcd'] extends [R]
+ ? $ResolveBranch<$O, [$Else]>
+ : $ResolveBranch<$O, [$Then], T>
+ : never
type _N = [T] extends [boolean]
? [T] extends [true]
diff --git a/packages/type-plus/src/equal/is-equal.ts b/packages/type-plus/src/equal/is-equal.ts
index 3cfe40aba0..7d06d02cdb 100644
--- a/packages/type-plus/src/equal/is-equal.ts
+++ b/packages/type-plus/src/equal/is-equal.ts
@@ -197,13 +197,8 @@ export namespace IsEqual {
* type R = IsEqual.$Same<{ a: 1 } & { b: 1 }, { a: 1; b: 1 }, { $then: 'yes'; $else: 'no' }> // 'no'
* ```
*/
- export type $Same = (<_>() => _ extends (A & _) | _ ? 1 : 2) extends <_>() => _ extends
- | (B & _)
- | _
- ? 1
- : 2
- ? $O['$then']
- : $O['$else']
+ export type $Same =
+ (<_>() => _ extends (A & _) | _ ? 1 : 2) extends <_>() => _ extends (B & _) | _ ? 1 : 2 ? $O['$then'] : $O['$else']
export type $ToProps = Assignable.$<
object,
diff --git a/packages/type-plus/src/function/is-function.ts b/packages/type-plus/src/function/is-function.ts
index 04af7410e4..00f8e4b8bc 100644
--- a/packages/type-plus/src/function/is-function.ts
+++ b/packages/type-plus/src/function/is-function.ts
@@ -131,9 +131,10 @@ export namespace IsFunction {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], $Exact.Default['exact']]> extends true
- ? $Distributive.Parse<$O, { $then: _D; $else: _ExactEqualNonDistributive }>
- : Assignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], $Exact.Default['exact']]> extends true
+ ? $Distributive.Parse<$O, { $then: _D; $else: _ExactEqualNonDistributive }>
+ : Assignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/function/is-not-function.ts b/packages/type-plus/src/function/is-not-function.ts
index 8a65f7d262..c2fd0b6152 100644
--- a/packages/type-plus/src/function/is-not-function.ts
+++ b/packages/type-plus/src/function/is-not-function.ts
@@ -132,9 +132,10 @@ export namespace IsNotFunction {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], $Exact.Default['exact']]> extends true
- ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
- : NotAssignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], $Exact.Default['exact']]> extends true
+ ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
+ : NotAssignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/index.surface.spec.ts b/packages/type-plus/src/index.surface.spec.ts
index bff73bebba..42fefaf07e 100644
--- a/packages/type-plus/src/index.surface.spec.ts
+++ b/packages/type-plus/src/index.surface.spec.ts
@@ -50,6 +50,10 @@ it('finds every entry', () => {
expect(listEntries()).toEqual(['src/index.ts', 'src/testing/index.ts'])
})
-it.each(listEntries())('%s exposes no implementation helpers', (entry) => {
- expect(listExposedHelpers(entry)).toEqual([])
-}, 60_000)
+it.each(listEntries())(
+ '%s exposes no implementation helpers',
+ (entry) => {
+ expect(listExposedHelpers(entry)).toEqual([])
+ },
+ 60_000,
+)
diff --git a/packages/type-plus/src/math/abs.ts b/packages/type-plus/src/math/abs.ts
index 63e7360abe..bad5f6a211 100644
--- a/packages/type-plus/src/math/abs.ts
+++ b/packages/type-plus/src/math/abs.ts
@@ -26,28 +26,26 @@ import type { IsNumber } from '../number/is-number.js'
* type R = Abs // 'nope'
* ```
*/
-export type Abs = {}> = IsNumber<
- N,
- IsNumber.$Branch
-> extends infer R
- ? R extends $Then
- ? [number] extends [N]
- ? _ResolveFail<$O>
- : `${N}` extends `-${infer P extends number}`
- ? P
- : N
- : R extends $Else
- ? IsBigint extends infer R
- ? R extends true
- ? [bigint] extends [N]
- ? _ResolveFail<$O>
- : `${N}` extends `-${infer P extends bigint}`
- ? P
- : N
- : _ResolveFail<$O>
+export type Abs = {}> =
+ IsNumber extends infer R
+ ? R extends $Then
+ ? [number] extends [N]
+ ? _ResolveFail<$O>
+ : `${N}` extends `-${infer P extends number}`
+ ? P
+ : N
+ : R extends $Else
+ ? IsBigint extends infer R
+ ? R extends true
+ ? [bigint] extends [N]
+ ? _ResolveFail<$O>
+ : `${N}` extends `-${infer P extends bigint}`
+ ? P
+ : N
+ : _ResolveFail<$O>
+ : never
: never
- : never
- : never
+ : never
export namespace Abs {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/add.ts b/packages/type-plus/src/math/add.ts
index 4fd97410ec..d26893c546 100644
--- a/packages/type-plus/src/math/add.ts
+++ b/packages/type-plus/src/math/add.ts
@@ -44,16 +44,17 @@ export type Add<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Add.$Options> = {},
-> = NumericStruct.Add<
- NumericStruct.FromNumeric>,
- NumericStruct.FromNumeric>
-> extends infer R
- ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
- // keeps the constraint of a deferred `Add<...>` narrow enough for generic callers such as `IndexAt`.
- R extends NumericStruct
- ? NumericStruct.ToNumeric
- : _ResolveFail<$O>
- : never
+> =
+ NumericStruct.Add<
+ NumericStruct.FromNumeric>,
+ NumericStruct.FromNumeric>
+ > extends infer R
+ ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
+ // keeps the constraint of a deferred `Add<...>` narrow enough for generic callers such as `IndexAt`.
+ R extends NumericStruct
+ ? NumericStruct.ToNumeric
+ : _ResolveFail<$O>
+ : never
export namespace Add {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/divide.ts b/packages/type-plus/src/math/divide.ts
index 57f1b4673f..dc86f896c3 100644
--- a/packages/type-plus/src/math/divide.ts
+++ b/packages/type-plus/src/math/divide.ts
@@ -114,11 +114,8 @@ type _Precision<$O> = (
* Converts the quotient to a `number`, dropping fractional digits while it has
* more than 15 significant digits and TypeScript cannot read it back.
*/
-type _ToNumber = DigitsStruct.ToString extends `${infer N extends number}`
- ? number extends N
- ? _Drop
- : N
- : _Drop
+type _ToNumber =
+ DigitsStruct.ToString extends `${infer N extends number}` ? (number extends N ? _Drop : N) : _Drop
type _Drop = [D[1], P] extends [
[...infer Q extends number[], number],
diff --git a/packages/type-plus/src/math/greater-than-or-equal.ts b/packages/type-plus/src/math/greater-than-or-equal.ts
index 20c5f560ae..3afa11a282 100644
--- a/packages/type-plus/src/math/greater-than-or-equal.ts
+++ b/packages/type-plus/src/math/greater-than-or-equal.ts
@@ -34,19 +34,20 @@ export type GreaterThanOrEqual<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, GreaterThanOrEqual.$Options> = {},
-> = GreaterThan extends infer R
- ? IsNever extends true
- ? A extends number
- ? number extends A
- ? _ResolveFail<$O>
- : [A, B] extends [B, A]
- ? true
- : _ResolveFail<$O>
- : _ResolveFail<$O>
- : R extends true
- ? false
- : true
- : never
+> =
+ GreaterThan extends infer R
+ ? IsNever extends true
+ ? A extends number
+ ? number extends A
+ ? _ResolveFail<$O>
+ : [A, B] extends [B, A]
+ ? true
+ : _ResolveFail<$O>
+ : _ResolveFail<$O>
+ : R extends true
+ ? false
+ : true
+ : never
export namespace GreaterThanOrEqual {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/greater-than.ts b/packages/type-plus/src/math/greater-than.ts
index 3e3bf38702..e104b7cf2c 100644
--- a/packages/type-plus/src/math/greater-than.ts
+++ b/packages/type-plus/src/math/greater-than.ts
@@ -36,11 +36,12 @@ export type GreaterThan<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, GreaterThan.$Options> = {},
-> = Subtract extends infer R extends number
- ? R extends 0
- ? false
- : IsPositive
- : _ResolveFail<$O>
+> =
+ Subtract extends infer R extends number
+ ? R extends 0
+ ? false
+ : IsPositive
+ : _ResolveFail<$O>
export namespace GreaterThan {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/less-than-or-equal.ts b/packages/type-plus/src/math/less-than-or-equal.ts
index 27c8a19f26..782e1d47d5 100644
--- a/packages/type-plus/src/math/less-than-or-equal.ts
+++ b/packages/type-plus/src/math/less-than-or-equal.ts
@@ -34,19 +34,20 @@ export type LessThanOrEqual<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, LessThanOrEqual.$Options> = {},
-> = GreaterThan extends infer R
- ? IsNever extends true
- ? A extends number
- ? number extends A
- ? _ResolveFail<$O>
- : [A, B] extends [B, A]
- ? true
- : _ResolveFail<$O>
- : _ResolveFail<$O>
- : R extends true
- ? false
- : true
- : never
+> =
+ GreaterThan extends infer R
+ ? IsNever extends true
+ ? A extends number
+ ? number extends A
+ ? _ResolveFail<$O>
+ : [A, B] extends [B, A]
+ ? true
+ : _ResolveFail<$O>
+ : _ResolveFail<$O>
+ : R extends true
+ ? false
+ : true
+ : never
export namespace LessThanOrEqual {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/max.ts b/packages/type-plus/src/math/max.ts
index b79d375ba5..37d3d8f046 100644
--- a/packages/type-plus/src/math/max.ts
+++ b/packages/type-plus/src/math/max.ts
@@ -29,13 +29,14 @@ export type Max<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Max.$Options> = {},
-> = GreaterThan extends infer Result
- ? IsNever extends true
- ? _ResolveFail<$O>
- : Result extends true
- ? A
- : B
- : never
+> =
+ GreaterThan extends infer Result
+ ? IsNever extends true
+ ? _ResolveFail<$O>
+ : Result extends true
+ ? A
+ : B
+ : never
export namespace Max {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/min.ts b/packages/type-plus/src/math/min.ts
index e3f2ae5df7..d4f7bc201d 100644
--- a/packages/type-plus/src/math/min.ts
+++ b/packages/type-plus/src/math/min.ts
@@ -29,13 +29,14 @@ export type Min<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Min.$Options> = {},
-> = GreaterThan extends infer Result
- ? IsNever extends true
- ? _ResolveFail<$O>
- : Result extends true
- ? B
- : A
- : never
+> =
+ GreaterThan extends infer Result
+ ? IsNever extends true
+ ? _ResolveFail<$O>
+ : Result extends true
+ ? B
+ : A
+ : never
export namespace Min {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/multiply.ts b/packages/type-plus/src/math/multiply.ts
index 87ab18f72d..8d15fe6c5a 100644
--- a/packages/type-plus/src/math/multiply.ts
+++ b/packages/type-plus/src/math/multiply.ts
@@ -32,16 +32,17 @@ export type Multiply<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Multiply.$Options> = {},
-> = NumericStruct.Multiply<
- NumericStruct.FromNumeric>,
- NumericStruct.FromNumeric>
-> extends infer R
- ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
- // keeps the constraint of a deferred `Multiply<...>` narrow enough for generic callers such as `IndexAt`.
- R extends NumericStruct
- ? NumericStruct.ToNumeric
- : _ResolveFail<$O>
- : never
+> =
+ NumericStruct.Multiply<
+ NumericStruct.FromNumeric>,
+ NumericStruct.FromNumeric>
+ > extends infer R
+ ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
+ // keeps the constraint of a deferred `Multiply<...>` narrow enough for generic callers such as `IndexAt`.
+ R extends NumericStruct
+ ? NumericStruct.ToNumeric
+ : _ResolveFail<$O>
+ : never
export namespace Multiply {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/numeric-struct.ts b/packages/type-plus/src/math/numeric-struct.ts
index ab497c4492..b97908b117 100644
--- a/packages/type-plus/src/math/numeric-struct.ts
+++ b/packages/type-plus/src/math/numeric-struct.ts
@@ -334,50 +334,44 @@ export namespace DigitsStruct {
* @template A A normalized `DigitsStruct`.
* @template B B normalized `DigitsStruct`.
*/
- export type Add = Balance extends [
- infer BA extends DigitsStruct,
- infer BB extends DigitsStruct,
- ]
- ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
- ? Normalize<['+', DigitArray.Add, BA[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['+', '-']
- ? Normalize<['+', DigitArray.Subtract, BA[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['-', '+']
- ? Normalize<['+', DigitArray.Subtract, BB[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['-', '-']
- ? Normalize<['-', DigitArray.Add, BA[EXPONENT]]>
- : never
- : never
-
- export type Subtract = Balance extends [
- infer BA extends DigitsStruct,
- infer BB extends DigitsStruct,
- ]
- ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
- ? Normalize<['+', DigitArray.Subtract, BA[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['+', '-']
+ export type Add =
+ Balance extends [infer BA extends DigitsStruct, infer BB extends DigitsStruct]
+ ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
? Normalize<['+', DigitArray.Add, BA[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['-', '+']
- ? Normalize<['-', DigitArray.Add, BA[EXPONENT]]>
- : [BA[SIGN], BB[SIGN]] extends ['-', '-']
- ? Normalize<['-', DigitArray.Subtract, BA[EXPONENT]]>
- : never
- : never
+ : [BA[SIGN], BB[SIGN]] extends ['+', '-']
+ ? Normalize<['+', DigitArray.Subtract, BA[EXPONENT]]>
+ : [BA[SIGN], BB[SIGN]] extends ['-', '+']
+ ? Normalize<['+', DigitArray.Subtract, BB[EXPONENT]]>
+ : [BA[SIGN], BB[SIGN]] extends ['-', '-']
+ ? Normalize<['-', DigitArray.Add, BA[EXPONENT]]>
+ : never
+ : never
- export type Multiply = NumericAdd<
- A[EXPONENT],
- B[EXPONENT]
- > extends infer Exp extends number
- ? [A[SIGN], B[SIGN]] extends ['+', '+']
- ? Normalize<['+', DigitArray.Multiply , Exp]>
- : [A[SIGN], B[SIGN]] extends ['+', '-']
- ? Normalize<['-', DigitArray.Multiply , Exp]>
- : [A[SIGN], B[SIGN]] extends ['-', '+']
- ? Normalize<['-', DigitArray.Multiply, Exp]>
- : [A[SIGN], B[SIGN]] extends ['-', '-']
- ? Normalize<['+', DigitArray.Multiply, Exp]>
- : never
- : never
+ export type Subtract =
+ Balance extends [infer BA extends DigitsStruct, infer BB extends DigitsStruct]
+ ? [BA[SIGN], BB[SIGN]] extends ['+', '+']
+ ? Normalize<['+', DigitArray.Subtract, BA[EXPONENT]]>
+ : [BA[SIGN], BB[SIGN]] extends ['+', '-']
+ ? Normalize<['+', DigitArray.Add, BA[EXPONENT]]>
+ : [BA[SIGN], BB[SIGN]] extends ['-', '+']
+ ? Normalize<['-', DigitArray.Add, BA[EXPONENT]]>
+ : [BA[SIGN], BB[SIGN]] extends ['-', '-']
+ ? Normalize<['-', DigitArray.Subtract, BA[EXPONENT]]>
+ : never
+ : never
+
+ export type Multiply =
+ NumericAdd extends infer Exp extends number
+ ? [A[SIGN], B[SIGN]] extends ['+', '+']
+ ? Normalize<['+', DigitArray.Multiply , Exp]>
+ : [A[SIGN], B[SIGN]] extends ['+', '-']
+ ? Normalize<['-', DigitArray.Multiply , Exp]>
+ : [A[SIGN], B[SIGN]] extends ['-', '+']
+ ? Normalize<['-', DigitArray.Multiply, Exp]>
+ : [A[SIGN], B[SIGN]] extends ['-', '-']
+ ? Normalize<['+', DigitArray.Multiply, Exp]>
+ : never
+ : never
/**
* Integer division of `A` by `B`: `[quotient, remainder]`, or `Fail` when
@@ -429,14 +423,12 @@ export namespace DigitsStruct {
/**
* Balance the two structs for add/subtract.
*/
- export type Balance = GetBalancePadding<
- A[EXPONENT],
- B[EXPONENT]
- > extends [infer Pads extends number[], infer Longer]
- ? Longer extends 'A'
- ? [A, [B[SIGN], DigitArray.TrimLeadingZeros<[...B[DIGITS], ...Pads]>, A[EXPONENT]]]
- : [[A[SIGN], DigitArray.TrimLeadingZeros<[...A[DIGITS], ...Pads]>, B[EXPONENT]], B]
- : never
+ export type Balance =
+ GetBalancePadding extends [infer Pads extends number[], infer Longer]
+ ? Longer extends 'A'
+ ? [A, [B[SIGN], DigitArray.TrimLeadingZeros<[...B[DIGITS], ...Pads]>, A[EXPONENT]]]
+ : [[A[SIGN], DigitArray.TrimLeadingZeros<[...A[DIGITS], ...Pads]>, B[EXPONENT]], B]
+ : never
type GetBalancePadding<
A extends number,
@@ -614,18 +606,14 @@ export namespace DigitArray {
/**
* One step of long division: how many times `B` fits in `R` (0 to 9), and what is left.
*/
- type DivDigit = Compare extends -1
- ? [D['length'], R]
- : DivDigit>, B, [...D, unknown]>
+ type DivDigit =
+ Compare extends -1 ? [D['length'], R] : DivDigit>, B, [...D, unknown]>
/**
* Compares two normalized digit arrays: `1` when `A > B`, `0` when equal, `-1` when `A < B`.
*/
- export type Compare = CompareLength extends infer L extends 1 | 0 | -1
- ? L extends 0
- ? CompareDigits
- : L
- : never
+ export type Compare =
+ CompareLength extends infer L extends 1 | 0 | -1 ? (L extends 0 ? CompareDigits : L) : never
type CompareLength = A extends [unknown, ...infer AT]
? B extends [unknown, ...infer BT]
diff --git a/packages/type-plus/src/math/quotient.ts b/packages/type-plus/src/math/quotient.ts
index 8a8e30e3bc..80f1b730c5 100644
--- a/packages/type-plus/src/math/quotient.ts
+++ b/packages/type-plus/src/math/quotient.ts
@@ -47,15 +47,16 @@ export type Quotient<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Quotient.$Options> = {},
-> = NumericStruct.DivMod<
- NumericStruct.FromNumeric >,
- NumericStruct.FromNumeric>,
- _ResolveFail<$O>
-> extends infer R
- ? R extends [infer Q extends NumericStruct, NumericStruct]
- ? NumericStruct.ToNumeric
- : _ResolveFail<$O>
- : never
+> =
+ NumericStruct.DivMod<
+ NumericStruct.FromNumeric>,
+ NumericStruct.FromNumeric>,
+ _ResolveFail<$O>
+ > extends infer R
+ ? R extends [infer Q extends NumericStruct, NumericStruct]
+ ? NumericStruct.ToNumeric
+ : _ResolveFail<$O>
+ : never
export namespace Quotient {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/remainder.ts b/packages/type-plus/src/math/remainder.ts
index 2215315027..caebd567b8 100644
--- a/packages/type-plus/src/math/remainder.ts
+++ b/packages/type-plus/src/math/remainder.ts
@@ -42,15 +42,16 @@ export type Remainder<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Remainder.$Options> = {},
-> = NumericStruct.DivMod<
- NumericStruct.FromNumeric>,
- NumericStruct.FromNumeric>,
- _ResolveFail<$O>
-> extends infer R
- ? R extends [NumericStruct, infer M extends NumericStruct]
- ? NumericStruct.ToNumeric
- : _ResolveFail<$O>
- : never
+> =
+ NumericStruct.DivMod<
+ NumericStruct.FromNumeric>,
+ NumericStruct.FromNumeric>,
+ _ResolveFail<$O>
+ > extends infer R
+ ? R extends [NumericStruct, infer M extends NumericStruct]
+ ? NumericStruct.ToNumeric
+ : _ResolveFail<$O>
+ : never
export namespace Remainder {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/math/subtract.ts b/packages/type-plus/src/math/subtract.ts
index 19570648f2..c894b8bf35 100644
--- a/packages/type-plus/src/math/subtract.ts
+++ b/packages/type-plus/src/math/subtract.ts
@@ -30,16 +30,17 @@ export type Subtract<
A extends number | bigint,
B extends number | bigint,
$O extends $StrictOptions<$O, Subtract.$Options> = {},
-> = NumericStruct.Subtract<
- NumericStruct.FromNumeric>,
- NumericStruct.FromNumeric>
-> extends infer R
- ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
- // keeps the constraint of a deferred `Subtract<...>` narrow enough for generic callers such as `IndexAt`.
- R extends NumericStruct
- ? NumericStruct.ToNumeric
- : _ResolveFail<$O>
- : never
+> =
+ NumericStruct.Subtract<
+ NumericStruct.FromNumeric>,
+ NumericStruct.FromNumeric>
+ > extends infer R
+ ? // `R` is already the `$fail` value when it is not a `NumericStruct`. Naming it here instead of returning `R`
+ // keeps the constraint of a deferred `Subtract<...>` narrow enough for generic callers such as `IndexAt`.
+ R extends NumericStruct
+ ? NumericStruct.ToNumeric
+ : _ResolveFail<$O>
+ : never
export namespace Subtract {
export interface $Options extends $Fail.$Options {}
diff --git a/packages/type-plus/src/mix-types/box.ts b/packages/type-plus/src/mix-types/box.ts
index da40781913..677937938d 100644
--- a/packages/type-plus/src/mix-types/box.ts
+++ b/packages/type-plus/src/mix-types/box.ts
@@ -27,44 +27,45 @@ import type { TypePlusOptions } from '../utils/options.js'
* Box // never
* ```
*/
-export type Box = {}> = IsFunction extends infer R
- ? R extends $Then
- ? Function
- : IsObject> extends infer R
- ? R extends $Then
- ? Object
- : T extends Record
- ? T
- : IsBoolean extends infer R
- ? R extends $Then
- ? Boolean
- : R extends $Else
- ? IsNumber extends infer R
- ? R extends $Then
- ? Number
- : R extends $Else
- ? IsString<
- T,
- {
- $then: String
- $else: IsSymbol<
- T,
- {
- $then: Symbol
- $else: IsBigint<
- T,
- { $then: BigInt; $else: TypePlusOptions.Merge<$O, Box.$Default>['$notBoxable'] }
- >
- }
- >
- }
- >
- : never
+export type Box = {}> =
+ IsFunction extends infer R
+ ? R extends $Then
+ ? Function
+ : IsObject> extends infer R
+ ? R extends $Then
+ ? Object
+ : T extends Record
+ ? T
+ : IsBoolean extends infer R
+ ? R extends $Then
+ ? Boolean
+ : R extends $Else
+ ? IsNumber extends infer R
+ ? R extends $Then
+ ? Number
+ : R extends $Else
+ ? IsString<
+ T,
+ {
+ $then: String
+ $else: IsSymbol<
+ T,
+ {
+ $then: Symbol
+ $else: IsBigint<
+ T,
+ { $then: BigInt; $else: TypePlusOptions.Merge<$O, Box.$Default>['$notBoxable'] }
+ >
+ }
+ >
+ }
+ >
+ : never
+ : never
: never
- : never
- : never
- : never
- : never
+ : never
+ : never
+ : never
export namespace Box {
export interface $Options {
diff --git a/packages/type-plus/src/number/is-not-number.ts b/packages/type-plus/src/number/is-not-number.ts
index d583efad65..778fee328b 100644
--- a/packages/type-plus/src/number/is-not-number.ts
+++ b/packages/type-plus/src/number/is-not-number.ts
@@ -116,9 +116,10 @@ export namespace IsNotNumber {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], false]> extends true
- ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
- : NotAssignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
+ : NotAssignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/number/is-number.ts b/packages/type-plus/src/number/is-number.ts
index 54cafe83d1..ad04fe7f5d 100644
--- a/packages/type-plus/src/number/is-number.ts
+++ b/packages/type-plus/src/number/is-number.ts
@@ -117,9 +117,10 @@ export namespace IsNumber {
* This is a type util for building custom types.
* It does not check against special types.
*/
- export type $ = $ResolveOptions<[$O['exact'], false]> extends true
- ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
- : Assignable.$
+ export type $ =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? $Distributive.Parse<$O, { $then: _D; $else: _N }>
+ : Assignable.$
}
type $UtilOptions = $Selection.Options & $Distributive.Options & $Exact.Options
diff --git a/packages/type-plus/src/numeric/is-integer.ts b/packages/type-plus/src/numeric/is-integer.ts
index 835db06821..da474c0a76 100644
--- a/packages/type-plus/src/numeric/is-integer.ts
+++ b/packages/type-plus/src/numeric/is-integer.ts
@@ -152,28 +152,29 @@ export namespace IsInteger {
* falls back to this check. The default path skips `$Special` entirely, which is cheaper than
* running it in front of checks that repeat its work.
*/
-type _IsInteger = $ResolveOptions<[$O['exact'], false]> extends true
- ? _ExactNumeric
- : IsNumber<
- T,
- {
- distributive: $O['distributive']
- $then: number extends T
- ? $ResolveBranch<$O, [$Then], number> | $ResolveBranch<$O, [$Else]>
- : T extends number & infer U
- ? `${T}` extends `${number}.${number}`
- ? $ResolveBranch<$O, [$Else]>
- : [T, U] extends [U, T]
- ? $ResolveBranch<$O, [$Then], T>
- : $ResolveBranch<$O, [$Then], number> | $ResolveBranch<$O, [$Else]>
- : never
- $else: IsBigint<
- T,
- {
- distributive: $O['distributive']
- $then: $ResolveBranch<$O, [$Then], T>
- $else: $ResolveBranch<$O, [$Else]>
- }
- >
- }
- >
+type _IsInteger =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? _ExactNumeric
+ : IsNumber<
+ T,
+ {
+ distributive: $O['distributive']
+ $then: number extends T
+ ? $ResolveBranch<$O, [$Then], number> | $ResolveBranch<$O, [$Else]>
+ : T extends number & infer U
+ ? `${T}` extends `${number}.${number}`
+ ? $ResolveBranch<$O, [$Else]>
+ : [T, U] extends [U, T]
+ ? $ResolveBranch<$O, [$Then], T>
+ : $ResolveBranch<$O, [$Then], number> | $ResolveBranch<$O, [$Else]>
+ : never
+ $else: IsBigint<
+ T,
+ {
+ distributive: $O['distributive']
+ $then: $ResolveBranch<$O, [$Then], T>
+ $else: $ResolveBranch<$O, [$Else]>
+ }
+ >
+ }
+ >
diff --git a/packages/type-plus/src/numeric/is-negative.ts b/packages/type-plus/src/numeric/is-negative.ts
index a445c162cf..96a96730e8 100644
--- a/packages/type-plus/src/numeric/is-negative.ts
+++ b/packages/type-plus/src/numeric/is-negative.ts
@@ -165,23 +165,24 @@ export namespace IsNegative {
* falls back to this check. The default path skips `$Special` entirely, which is cheaper than
* running it in front of checks that repeat its work.
*/
-type _IsNegative = $ResolveOptions<[$O['exact'], false]> extends true
- ? _ExactNumeric
- : IsBigint<
- T,
- {
- distributive: $O['distributive']
- $then: _Negative
- $else: IsNumber<
- Exclude,
- {
- distributive: $O['distributive']
- $then: _Negative
- $else: $ResolveBranch<$O, [$Else]>
- }
- >
- }
- >
+type _IsNegative =
+ $ResolveOptions<[$O['exact'], false]> extends true
+ ? _ExactNumeric
+ : IsBigint<
+ T,
+ {
+ distributive: $O['distributive']
+ $then: _Negative
+ $else: IsNumber<
+ Exclude