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

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

Open semlinker opened this issue 4 years ago • 20 comments

实现一个 Tail 工具类型,用于获取数组类型除了第一个类型外,剩余的类型。具体的使用示例如下所示:

type Tail<T extends Array<any>> =  // 你的实现代码

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

提示:该题目有多种解法,感兴趣小伙伴可以自行尝试一下。 请在下面评论你的答案。

semlinker avatar Sep 16 '21 12:09 semlinker

type Tail<T extends Array<any>> = T extends [infer A, ...infer B] ? B : [];

// 测试用例
type T0 = Tail<[]>; // []
type T1 = Tail<[1, 2]>; // [2]
type T2 = Tail<[1, 2, 3, 4, 5]>; // [2, 3, 4, 5]

sunboyZgz avatar Sep 16 '21 12:09 sunboyZgz

// 第三道
type Tail<T extends Array<any>> = T extends [f: any, ...rest: infer U] ? U : [];

// 测试用例
type T0 = Tail<[]>; // []
type T1 = Tail<[1, 2]>; // [2]
type T2 = Tail<[1, 2, 3, 4, 5]>; // [2, 3, 4, 5]

zhaoxiongfei avatar Sep 16 '21 14:09 zhaoxiongfei

type Tail<T extends Array<any>> = ((...t: T) => void) extends (h: any, ...args: infer R) => void? R : never

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

douhao1988 avatar Sep 17 '21 14:09 douhao1988

type Tail<T extends Array<any>> = T extends [] ? [] : (T extends [any, ...infer Rest] ? Rest : never) // 你的实现代码

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

mingzhans avatar Sep 21 '21 14:09 mingzhans

type Tail<T extends Array<any>> = T extends [any, ... infer Rest] ? Rest : []; // 你的实现代码

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

wenye123 avatar Sep 24 '21 06:09 wenye123

type Tail<T extends Array> = T extends [infer F, ...infer R] ? R : never type T0 = Tail<[]> // [] type T1 = Tail<[1, 2]> // [2] type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

Suc5999 avatar Sep 26 '21 10:09 Suc5999

type Tail<T extends Array<any>> = T extends [fir: infer U, ...arg: infer Arg] ? Arg : []

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

Mrlgm avatar Sep 27 '21 12:09 Mrlgm

type Tail<T extends Array<any>> =  // 你的实现代码

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]
type Tail<T extends Array<any>> = T extends [infer F, ...infer Rest] ? Rest : [];

winfa avatar Sep 27 '21 15:09 winfa

// 实现一个 Tail 工具类型,用于获取数组类型除了第一个类型外,剩余的类型。具体的使用示例如下所示:

type Tail<T extends Array<any>> = T extends [infer A, ...infer B] ? B : [];

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

利用数组形状直接infer 配合extends获取后面的部分。

zhaoxiongfei avatar Oct 01 '21 15:10 zhaoxiongfei

type Tail<T extends Array<any>> = T extends [infer F, ...infer Rest] ? Rest : [] // 你的实现代码

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

Flavour86 avatar Oct 21 '21 03:10 Flavour86

export default {}

// 实现一个 Tail 工具类型,用于获取数组类型除了第一个类型外,剩余的类型。具体的使用示例如下所示:

type Tail<T extends Array> = T extends [infer L, ...infer R] ? R : []

// 测试用例 type T0 = Tail<[]> // [] type T1 = Tail<[1, 2]> // [2] type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

a572251465 avatar Dec 01 '21 22:12 a572251465

type Tail<T extends any[]> = T extends [infer F, ...infer O] ? O : [];

liulise avatar Dec 07 '21 04:12 liulise

type Tail<T extends any[]> = T extends [any, ...infer Rest] ? Rest : []

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]
type T3 = Tail<[1]> // []

yang131323 avatar Jan 13 '22 08:01 yang131323

type Tail<T extends Array> = T extends [infer H, ...infer O] ? O : []

smartymoon avatar Jan 14 '22 14:01 smartymoon

type Tail<T extends Array<any>> =  
  T extends [any, ...infer Rest]
    ? Rest
    : []

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

waleiwalei avatar Mar 14 '22 14:03 waleiwalei

// 解法1, infer指代rest参数来求解
type Tail<T extends Array<any>> =  T extends [a: any, ...r: infer K] ? K : []

貌似就一个解法...

ChangerHe avatar May 27 '22 03:05 ChangerHe

type Tail<T extends Array> = T extends [T[0], ...infer K] ? K : []; // 你的实现代码

itcast-e avatar Aug 18 '22 08:08 itcast-e

type Tail<T extends Array<any>> = T extends [infer A, ...infer B] ? B : []; // 你的实现代码

// 测试用例
type T0 = Tail<[]>; // []
type T1 = Tail<[1, 2]>; // [2]
type T2 = Tail<[1, 2, 3, 4, 5]>; // [2, 3, 4, 5]

fishcoderman avatar Aug 25 '22 14:08 fishcoderman

type Tail<T extends Array<any>> = T extends [infer A, ...infer B] ? B : [];

// 测试用例
type T0 = Tail<[]>; // []
type T1 = Tail<[1, 2]>; // [2]
type T2 = Tail<[1, 2, 3, 4, 5]>; // [2, 3, 4, 5]

@semlinker 你好,除了这种Rest的方法,还有更多的解法吗

SongJuXin avatar Oct 01 '22 08:10 SongJuXin

type Tail<T extends Array<any>> = T extends [infer F, ...infer R] ? R : [];

// 测试用例
type T0 = Tail<[]> // []
type T1 = Tail<[1, 2]> // [2]
type T2 = Tail<[1, 2, 3, 4, 5]> // [2, 3, 4, 5]

SweeperDuan avatar Dec 11 '23 10:12 SweeperDuan