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 • 9 comments

实现一个 Repeat 工具类型,用于根据类型变量 C 的值,重复 T 类型并以元组的形式返回新的类型。具体的使用示例如下所示:

type Repeat<T, C extends number> = // 你的实现代码

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]

请在下面评论你的答案

semlinker avatar Sep 22 '21 13:09 semlinker

type Push<T extends any[], V> =  [...T, V];

type Repeat<
  T,
  C extends number,
  R extends Array<any> = []
> = R['length'] extends C ? R : Repeat<T, C, Push<R, T>>;

type R01 = Repeat<0, 0>; // []
type R11 = Repeat<1, 1>; // [1]
type R21 = Repeat<number, 2>; // [number, number]
type R22 = Repeat<string, 5>; // [string, string, string, string, string]

douhao1988 avatar Sep 22 '21 14:09 douhao1988

type Repeat<T, C extends number, A extends any[] = []> = A["length"] extends C
  ? A
  : Repeat<T, C, [...A, T]>;

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]

zhaoxiongfei avatar Sep 22 '21 14:09 zhaoxiongfei

和 32 题思路一样

type Repeat<
  T, 
  C extends number,
  S extends any[] = [],   //  递归判断条件
  U extends any[] = []    //  累加记录
> = S['length'] extends C ? U : Repeat<T, C, [...S, 1], [...U, T]>

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]

xiaoYuanDun avatar Sep 23 '21 08:09 xiaoYuanDun

type Repeat<T, C extends number, A extends any[] = []> = A["length"] extends C
  ? A
  : Repeat<T, C, [...A, T]>;

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]
type R3 = Repeat<number | string, 3>; // [number | string, number | string, number | string]
type R4 = Repeat<never, 2>; // [never, never]
type R5 = Repeat<any, 2>; // [any, any]
type R6 = Repeat<unknown, 2>; // [unknown, unknown]

思路: 通过extends来判断构造的数组长度是否满足要求

zhaoxiongfei avatar Oct 03 '21 05:10 zhaoxiongfei

type Repeat<T, C extends number, R extends any[] = []> = R['length'] extends C ? R : Repeat<T ,C, [T,...R]>// 你的实现代码

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]

mingzhans avatar Oct 07 '21 05:10 mingzhans

和 32 题思路一样

type Repeat<
  T, 
  C extends number,
  S extends any[] = [],   //  递归判断条件
  U extends any[] = []    //  累加记录
> = S['length'] extends C ? U : Repeat<T, C, [...S, 1], [...U, T]>

type R0 = Repeat<0, 0>; // []
type R1 = Repeat<1, 1>; // [1]
type R2 = Repeat<number, 2>; // [number, number]

S 和 U 是否使用一个就行

safarishi avatar Oct 12 '21 03:10 safarishi

type _Repeat<
  T,
  C extends number,
  List extends T[] = []
> = List["length"] extends C ? List : _Repeat<T, C, [...List, T]>;

type Repeat<T, C extends number> = _Repeat<T, C, []>;

zjxxxxxxxxx avatar Mar 24 '22 03:03 zjxxxxxxxxx

为什么我的S['length'] 读取是 number 类型而不是具体值,是配置问题吗

Nygma0058 avatar Apr 09 '22 13:04 Nygma0058

type Repeat<T, C extends number, R extends any[] = []> = R['length'] extends C ? R : Repeat<T, C, [T, ...R]> // 你的实现代码

type R0 = Repeat<0, 0>; // [] type R1 = Repeat<1, 1>; // [1] type R2 = Repeat<number, 2>; // [number, number]

liziqiang avatar Jul 14 '22 09:07 liziqiang