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

实现一个 Head 工具类型,用于获取数组类型的第一个类型。具体的使用示例如下所示:

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

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

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

semlinker avatar Sep 16 '21 12:09 semlinker

type Head<T extends Array<any>> = T extends [] ? never : T[0];

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

sunboyZgz avatar Sep 16 '21 12:09 sunboyZgz

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

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

zhaoxiongfei avatar Sep 16 '21 14:09 zhaoxiongfei

type Head<T extends Array<any>> = T[0] extends undefined ? never : T[0]

gitivon avatar Sep 17 '21 05:09 gitivon

type Head<T extends Array<any>> = undefined extends T[0] ? never : 
((...t: T) => void) extends (h: infer A, ...args: any[]) => void? A : never

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

douhao1988 avatar Sep 17 '21 14:09 douhao1988

type NonEmptyArray = [any, ...any[]]; //非空数组

type Head<T extends any[]> = T extends NonEmptyArray ? T[0] : never
// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

869288142 avatar Sep 19 '21 03:09 869288142

type Head <T extends any[]> = T['length'] extends 0 ? never : T[0];

type Head <T extends any[]> = T extends [head : infer H, ...rest : any[]] ? H : never;

type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3
type H3 = Head<["a", "b", "c"]> // "a"
type H4 = Head<[undefined, "b", "c"]> // undefined
type H5 = Head<[null, "b", "c"]> // null

pingan8787 avatar Sep 20 '21 17:09 pingan8787

type Head<T extends Array<any>> = T extends [infer First, ...any[]] ? First : never;

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

wenye123 avatar Sep 24 '21 05:09 wenye123

type Head<T extends Array> = T extends [infer R, ...any] ? R : never type H0 = Head<[]> // never type H1 = Head<[1]> // 1 type H2 = Head<[3, 2]> // 3

Suc5999 avatar Sep 26 '21 10:09 Suc5999

type Head<T extends Array<any>> = T extends [...arg: infer Arg] ? Arg[0] extends undefined ? never : Arg[0] : never

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

Mrlgm avatar Sep 27 '21 12:09 Mrlgm

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

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3
type Head<T extends Array<any>> = T[0] extends undefined ? never : T[0];

winfa avatar Sep 27 '21 15:09 winfa

type Head<T extends Array<any>> = Extract<T[number], T[0]>; // 你的实现代码

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

ccbabi avatar Sep 29 '21 04:09 ccbabi

// 实现一个 Head 工具类型,用于获取数组类型的第一个类型。具体的使用示例如下所示:

// 解法1 根据数组形状来获取
// type Head<T extends Array<any>> = T extends [infer F, ...infer Rest] ? F : never;
// 解法2 确保数组不为空的之后,直接通过索引0获取
type Head<T extends Array<any>> = T["length"] extends 0 ? never : T[0];

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

zhaoxiongfei avatar Oct 01 '21 15:10 zhaoxiongfei

type Head<T extends Array> = T extends [infer R, ...infer Rest] ? R : never // 你的实现代码

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

Flavour86 avatar Oct 21 '21 03:10 Flavour86

export default {}

// 实现一个 Head 工具类型,用于获取数组类型的第一个类型。具体的使用示例如下所示: type Head<T extends Array> = T extends [infer L, ...infer R] ? L : never

// 测试用例 type H0 = Head<[]> // never type H1 = Head<[1]> // 1 type H2 = Head<[3, 2]> // 3

a572251465 avatar Dec 01 '21 15:12 a572251465

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

liulise avatar Dec 07 '21 03:12 liulise

// 12 type Head<T extends Array> = T extends [f: infer F, ...args: any[]] ? F : never;

// 测试用例 type H0 = Head<[]> // never type H1 = Head<[1]> // 1 type H2 = Head<[3, 2]> // 3

Ljp10086 avatar Dec 30 '21 12:12 Ljp10086

type Head<T extends any[]> = T extends [infer One, ...any[]] ? One : never

yang131323 avatar Jan 13 '22 08:01 yang131323

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

smartymoon avatar Jan 14 '22 14:01 smartymoon

type Head<T extends any[]> = T extends [infer H, ...infer B] ? H : never type H0 = Head<[]> // never type H1 = Head<[1]> // 1 type H2 = Head<[3, 2]> // 3 type H3 = Head<["a", "b", "c"]> // "a" type H4 = Head<[undefined, "b", "c"]> // undefined type H5 = Head<[null, "b", "c"]> // null

Young-zhiqiang avatar Mar 12 '22 03:03 Young-zhiqiang

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

// 测试用例
type H0 = Head<[]> // never
type H1 = Head<[1]> // 1
type H2 = Head<[3, 2]> // 3

waleiwalei avatar Mar 14 '22 14:03 waleiwalei

// 解法1: 使用infer来取出类型并返回
type Head<T extends Array<any>> = T extends [f: infer K, ...r: any[]] ? K : never

// 解法2: 如果T是空数组, 则返回never, 否则返回T0
type Head1<T extends Array<any>> = T extends [] ? never : T[0]

ChangerHe avatar May 27 '22 03:05 ChangerHe

平安已经收到你的邮件啦

pingan8787 avatar May 27 '22 03:05 pingan8787

type Head<T extends Array<any>> = T extends {0:any}? T[0] : never

ChuTingzj avatar Jun 01 '22 13:06 ChuTingzj

type Head<T extends Array<any>> = T[0] extends undefined ? never : T[0]

LiuerQin avatar Jun 29 '22 09:06 LiuerQin

平安已经收到你的邮件啦

pingan8787 avatar Jun 29 '22 09:06 pingan8787

javascript // 解一: // type Head<T extends Array> = T extends [infer First, ...infer Reset] // ? First // : never;

// 解二: // type Head<T extends Array> = T extends [] ? never : T[0];

// 解三: // type Head<T extends any[]> = T['length'] extends 0 ? never : T[0];

// 解四: type Head<T extends any[]> = T[0] extends T[number] ? T[0] : never;

// 测试用例 type H0 = Head<[]>; // never type H1 = Head<[1]>; // 1 type H2 = Head<[3, 2]>; // 3 javascript

PLAxiaoxin avatar Aug 17 '22 07:08 PLAxiaoxin

// 解一:
// type Head<T extends Array<any>> = T extends [infer First, ...infer Reset]
//   ? First
//   : never;

// 解二:
// type Head<T extends Array<any>> = T extends [] ? never : T[0];

// 解三:
// type Head<T extends any[]> = T['length'] extends 0 ? never : T[0];

// 解四:
type Head<T extends any[]> = T[0] extends T[number] ? T[0] : never;

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

PLAxiaoxin avatar Aug 17 '22 07:08 PLAxiaoxin

type Head<T extends any[]> = T extends {0: infer P}? P : never;

g1f9 avatar Aug 20 '22 01:08 g1f9

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

// 测试用例
type H0 = Head<[]>; // never
type H1 = Head<[1]>; // 1
type H2 = Head<[3, 2]>; // 3

fishcoderman avatar Aug 25 '22 14:08 fishcoderman

type Head<T extends Array<any>> = T extends [infer F, ...infer Rest] ? F : never;

SweeperDuan avatar Dec 11 '23 10:12 SweeperDuan