[Typescript] 140. Extreme - Integers Comparator
Implement a type-level integers comparator. We've provided an enum for indicating the comparison result, like this:
- If
a
is greater thanb
, type should beComparison.Greater
. - If
a
andb
are equal, type should beComparison.Equal
. - If
a
is lower thanb
, type should beComparison.Lower
.
Note that a
and b
can be positive integers or negative integers or zero, even one is positive while another one is negative.
enum Comparison {
Greater,
Equal,
Lower,
}
export type IsNegative<T extends number> =
NumberToString<T> extends `-${number}` ? true : false;
export type NumberToString<T extends number> = `${T}`;
type ToNumber<
S extends string,
ACC extends unknown[] = []
> = S extends `${number}`
? S extends `${ACC["length"]}`
? ACC["length"]
: ToNumber<S, [...ACC, unknown]>
: never;
type Absolute<T extends number> = `${T}` extends `-${infer A}` ? ToNumber<A> : T;
type NegativeComparator<T extends number, U extends number, ACC extends unknown[] = []> = T extends U
? Comparison.Equal
: ACC['length'] extends Absolute<T>
? Comparison.Greater
: ACC['length'] extends Absolute<U>
? Comparison.Lower
: NegativeComparator<T, U, [...ACC, unknown]>;
type PositiveComparator<T extends number, U extends number, ACC extends unknown[] = []> = T extends U
? Comparison.Equal
: ACC['length'] extends T
? Comparison.Lower
: ACC['length'] extends U
? Comparison.Greater
: PositiveComparator<T, U, [...ACC, unknown]>;
type Comparator<A extends number, B extends number> = [IsNegative<A>, IsNegative<B>] extends [infer SINGALA, infer SINGALB]
? [SINGALA, SINGALB] extends [true, true]
? NegativeComparator<A, B>
: [SINGALA, SINGALB] extends [false, false]
? PositiveComparator<A, B>
: [SINGALA, SINGALB] extends [true, false]
? Comparison.Lower
: [SINGALA, SINGALB] extends [false, true]
? Comparison.Greater
: never
: never;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Comparator<5, 5>, Comparison.Equal>>,
Expect<Equal<Comparator<5, 6>, Comparison.Lower>>,
Expect<Equal<Comparator<5, 8>, Comparison.Lower>>,
Expect<Equal<Comparator<5, 0>, Comparison.Greater>>,
Expect<Equal<Comparator<-5, 0>, Comparison.Lower>>,
Expect<Equal<Comparator<0, 0>, Comparison.Equal>>,
Expect<Equal<Comparator<0, -5>, Comparison.Greater>>,
Expect<Equal<Comparator<5, -3>, Comparison.Greater>>,
Expect<Equal<Comparator<5, -7>, Comparison.Greater>>,
Expect<Equal<Comparator<-5, -7>, Comparison.Greater>>,
Expect<Equal<Comparator<-5, -3>, Comparison.Lower>>,
Expect<Equal<Comparator<-25, -30>, Comparison.Greater>>,
Expect<Equal<Comparator<15, -23>, Comparison.Greater>>,
Expect<Equal<Comparator<40, 37>, Comparison.Greater>>,
Expect<Equal<Comparator<-36, 36>, Comparison.Lower>>,
Expect<Equal<Comparator<27, 27>, Comparison.Equal>>,
Expect<Equal<Comparator<-38, -38>, Comparison.Equal>>,
]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-12-19 [React] Use SuspenseList for Coordinating Suspending Components
2019-12-19 [React] Create a Custom Hook that Creates Resources
2019-12-19 [Algorithm] 160. Intersection of Two Linked Lists
2019-12-19 [Algorithm] 204. Count Primes
2017-12-19 [Python] Boolean Or "Mask" Index Arrays filter with numpy
2016-12-19 [RxJS] Use RxJS concatMap to map and concat high order observables
2016-12-19 [RxJS] Use RxJS mergeMap to map and merge high order observables