semlinker/awesome-typescript

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

Opened this issue · 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]

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

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]
// 第三道
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]
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]
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]
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]

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]

Mrlgm commented
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]
winfa commented
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 : [];

// 实现一个 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获取后面的部分。

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]

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]

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

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]> // []

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

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

貌似就一个解法...

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

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]
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的方法,还有更多的解法吗

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]