type-challenges:Greater Than

13 阅读1分钟

Greater Than

问题描述

在这个挑战中,你应该实现一个类型 GreaterThan<T, U> 比如T > U

负数不需要考虑。

举例:

GreaterThan<2, 1> //should be true
GreaterThan<1, 1> //should be false
GreaterThan<10, 100> //should be false
GreaterThan<111, 11> //should be true
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils';
​
type cases = [
  Expect<Equal<GreaterThan<1, 0>, true>>,
  Expect<Equal<GreaterThan<5, 4>, true>>,
  Expect<Equal<GreaterThan<4, 5>, false>>,
  Expect<Equal<GreaterThan<0, 0>, false>>,
  Expect<Equal<GreaterThan<10, 9>, true>>,
  Expect<Equal<GreaterThan<20, 20>, false>>,
  Expect<Equal<GreaterThan<10, 100>, false>>,
  Expect<Equal<GreaterThan<111, 11>, true>>,
  Expect<Equal<GreaterThan<1234567891011, 1234567891010>, true>>,
]
​
​
// ============= Your Code Here =============
// 答案1
type ArrayWithLength<T extends number, U extends any[] = []> = U['length'] extends T ? U : ArrayWithLength<T, [true, ...U]>;
type GreaterThan<T extends number, U extends number> = ArrayWithLength<U> extends [...ArrayWithLength<T>, ...infer _] ? false : true;
​
// 答案2
type ParseInt<T> = T extends `${infer X extends number}` ? X :  nevertype RemoveLeadingZeros<T extends string> = T extends '0' ? T : (
  T extends `${0}${infer Rest}` ? RemoveLeadingZeros<Rest> : T
)
​
type InnerMinusOne<T extends string> = T extends `${infer X extends number}${infer Y}` ? (
  X extends 0 ? `9${InnerMinusOne<Y>}` : `${[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8][X]}${Y}`
) : ''type Reverse<T extends string> = T extends `${infer X}${infer Y}` ? `${Reverse<Y>}${X}` : ''type MinusOne<T extends number> = ParseInt<RemoveLeadingZeros<Reverse<InnerMinusOne<Reverse<`${T}`>>>>>
​
type InnerGreaterThan<T extends number, U extends number> = T extends U ? true : (
  T extends 0 ? false : InnerGreaterThan<MinusOne<T>, U>
)
​
type GreaterThan<T extends number, U extends number> = T extends U ? false : (
  U extends 0 ? true : InnerGreaterThan<T, U>
)
​
​

答案1最后一个测试用例不通过,答案2和 MinusOne这道题思路差不多,需要将数字转为字符串。