awesome-typescript icon indicating copy to clipboard operation
awesome-typescript copied to clipboard

「重学TS 2.0 」TS 练习题第三十四题

Open semlinker opened this issue 3 years ago • 8 comments

实现一个 SmallerThan 工具类型,用于比较数值类型的大小。具体的使用示例如下所示:

type SmallerThan<
  N extends number,
  M extends number,
> = // 你的实现代码

type S0 = SmallerThan<0, 1>; // true
type S1 = SmallerThan<2, 0>; // false
type S2 = SmallerThan<8, 10>; // true

请在下面评论你的答案

semlinker avatar Sep 22 '21 13:09 semlinker

TS中没有直接对比数值的操作,所以需要用 extends 来代替,达到类似的目的,这里默认从一个空数组开始递增,每次判断这个数组的长度和 M,N 是否相同

  • 辅助判断的数组 S 是从长度为 0 开始递增的,所以第一个和 L 相等的数一定是两个数中较小的那一个(有可能相等)
  • 若 N 与 L 相等,则 N <= M,还需要一次额外判断
  •    若 M 与 L 也相等,则 N === M
  •    若 M 不等于 L,则 N < M
  • 若 N 与 L 不相等,则继续判断 M
  •    若 M 等于 L,这 N > M
  •    若 M 也不等于 L,则表示 M,N 都不匹配,增加 S 长度,继续做下一次 SmallerThan 判断
type SmallerThan<N extends number, M extends number, S extends any[] = [], L = S['length']> = 
  L extends N 
    ? L extends M ? false : true 
    : L extends M ? false : SmallerThan<N, M, [...S, 1]>

//  测试用例
type S0 = SmallerThan<0, 1>; // true
type S1 = SmallerThan<2, 0>; // false
type S2 = SmallerThan<8, 10>; // true
type S3 = SmallerThan<5, 5>; // false

xiaoYuanDun avatar Sep 23 '21 01:09 xiaoYuanDun

type SmallerThan<
  N extends number,
  M extends number,
  A extends any[] = []
> = A["length"] extends M
  ? false
  : A["length"] extends N
    ? true
    : SmallerThan<N, M, [...A, ""]>

type S0 = SmallerThan<0, 1>; // true
type S1 = SmallerThan<2, 0>; // false
type S2 = SmallerThan<8, 10>; // true
type S3 = SmallerThan<8, 8>; // false

思路: 依然是利用构造数组的长度来判断,体用递归逐步迭代,先和哪个数匹配上,哪个数就小,注意边界问题。 这里要求的是第一个数小,如果相等,返回自然是false

zhaoxiongfei avatar Oct 03 '21 05:10 zhaoxiongfei

type SmallerThan<
  N extends number,
  M extends number,
  A extends any[] = []
> = A["length"] extends M
  ? false
  : A["length"] extends N
    ? true
    : SmallerThan<N, M, [...A, ""]>

type S0 = SmallerThan<0, 1>; // true
type S1 = SmallerThan<2, 0>; // false
type S2 = SmallerThan<8, 10>; // true
type S3 = SmallerThan<8, 8>; // false

思路: 依然是利用构造数组的长度来判断,体用递归逐步迭代,先和哪个数匹配上,哪个数就小,注意边界问题。 这里要求的是第一个数小,如果相等,返回自然是false 神操,6,大佬学到了!

xq52301nzdm avatar May 07 '22 09:05 xq52301nzdm

// 实现一个 SmallerThan 工具类型,用于比较数值类型的大小。具体的使用示例如下所示:
// type SmallerThan<
//   N extends number,
//   M extends number,
// > = // 你的实现代码
// type S0 = SmallerThan<0, 1>; // true
// type S1 = SmallerThan<2, 0>; // false
// type S2 = SmallerThan<8, 10>; // true

//answer
type SmallerThan<N extends number, M extends number, A extends any[] = []> = N extends A['length'] ? true : M extends A['length'] ? false : SmallerThan<N, M, [...A, 1]>
type S00 = SmallerThan<0, 1> // true
type S11 = SmallerThan<2, 0> // false
type S22 = SmallerThan<8, 10> // true

ChuTingzj avatar Jun 12 '22 13:06 ChuTingzj

这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

xq52301nzdm avatar Jun 12 '22 13:06 xq52301nzdm

type SmallerThan<
  N extends number,
  M extends number,
  A extends any[] = []
> = N extends A['length']
  ? M extends A['length']
    ? false
    : true
  : M extends A['length']
    ? false
    : SmallerThan<N, M, [...A, '']>

type S0 = SmallerThan<0, 1>; // true
type S1 = SmallerThan<2, 0>; // false
type S2 = SmallerThan<8, 10>; // true

zhengyimeng avatar Nov 14 '22 03:11 zhengyimeng

type SmallerThan<N extends number, M extends number, > = keyof Repeat<1, N> extends keyof Repeat<1, M>?true:false;// 你的实现代码

type S0111 = SmallerThan<0, 1>; // true

type S122 = SmallerThan<2, 0>; // false type S233 = SmallerThan<8, 10>; // true

silencefore avatar Apr 03 '23 06:04 silencefore

这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

xq52301nzdm avatar Apr 03 '23 06:04 xq52301nzdm