semlinker/awesome-typescript

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

semlinker opened this issue · 17 comments

实现一个 Shift 工具类型,用于移除 T 数组类型中的第一个类型。具体的使用示例如下所示:

type Shift<T extends any[]> = // 你的实现代码

// 测试用例
type S0 = Shift<[1, 2, 3]> 
type S1 = Shift<[string,number,boolean]> 

请在下面评论你的答案。

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

// 测试用例
type S0 = Shift<[1, 2, 3]>; // [2,3]
type S1 = Shift<[string, number, boolean]>; //[number, boolean]
type S2 = Shift<[]>; // []
type S3 = Shift<[string]>; // []
type Shift<T extends Array<any>> = T extends [any, ...infer U] ? U : []
// 测试用例
type S0 = Shift<[1, 2, 3]> 
type S1 = Shift<[string,number,boolean]> 
type Shift<T extends any[]> = ((...t: T) => void) extends (h: any, ...args: infer R) => void ? R : never;

// 测试用例
type S0 = Shift<[1, 2, 3]> // [2,3]
type S1 = Shift<[string,number,boolean]> // [number, boolean]
type S2 = Shift<[1]> // => []
type S3 = Shift<[]> // => []

type Shift<T extends any[]> =T extends [A : any , ...Arguments : infer B] ? B :never

解析: 定义一个变量 B ,为除去第一个类型的其他类型集合,然后extends约束以后,称为B。
// 测试用例
type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string,number,boolean]>


type Shift<T extends any[]> = T extends [any, ...infer Args] ? [ ...Args] : never// 你的实现代码

// 测试用例
type S0 = Shift<[1, 2, 3]> // [2,3]
type S1 = Shift<[string,number,boolean]> //[number,boolean]

// type Shift<T extends any[]> = T extends [infer F, ...infer R] ? R : never
type Shift<T extends any[]> = ((...args: T) => void) extends ((f: infer F, ...r: infer Rest) => void) ? Rest : never
type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string,number,boolean]>

Mrlgm commented
type Shift<T extends any[]> = T extends [infer U, ...infer Arg] ? Arg : T

// 测试用例
type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string, number, boolean]>
winfa commented
type Shift<T extends any[]> = // 你的实现代码

// 测试用例
type S0 = Shift<[1, 2, 3]> 
type S1 = Shift<[string,number,boolean]> 
type Shift<T extends any[]> = T extends [infer F, ...infer Rest] ? Rest : [];
type Shift<T extends any[]> = T extends [infer F, ... infer Rest] ? Rest : []

// 测试用例
type S0 = Shift<[1, '1', 3]> 
type S1 = Shift<[string,number,boolean]> 
type S2 = Shift<[string]>

export default {}

// 实现一个 Shift 工具类型,用于移除 T 数组类型中的第一个类型。具体的使用示例如下所示:
type Shift<T extends any[]> = T extends [infer A, ...infer args] ? args : never

// 测试用例
type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string,number,boolean]>

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

type Shift<T extends any[]> = T extends [f: any, ...args: infer Args] ? Args : any[];

// 测试用例
type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string,number,boolean]>

zouyk commented

type Shift<T extends any[]> = T extends [any, ... infer R ] ? R :[]

type S0 = Shift<[1, 2, 3]>
type S1 = Shift<[string,number,boolean]>
type S2 = Shift<[]>
type S3 = Shift<[1]>

type Shift<T extends any[]> = 
  T extends [infer Rirst, ...infer Arr]
    ? Arr
    : []

// 测试用例
type S0 = Shift<[1, 2, 3]> 
type S1 = Shift<[string,number,boolean]> 
``
type Shift<T extends any[]> = T extends [any, ...infer Rest] ? Rest : never // 你的实现代码

// 测试用例
type S0 = Shift<[1, 2, 3]> 
type S1 = Shift<[string,number,boolean]> 

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

// 测试用例
type S0 = Shift<[1, 2, 3]>;
type S1 = Shift<[string, number, boolean]>;
type Shift<T extends any[]> = T extends [infer F, ...infer Rest] ? Rest : T

// 测试用例
type S0 = Shift<[1, 2, 3]> // [2, 3]
type S1 = Shift<[string,number,boolean]> // [number,boolean]
type S2 = Shift<[]> // []