The solution to this problem can't just be the first element of the array. Since there is a test case that checks for undefined
and []
arrays, which is the main challenge of this problem.
type First<T extends any[]> =T extends []? never:T[0]
Here T extends []
means if T is an empty array or not. If not, then simply return the first element.
type First<T extends any[]> =T["length"] extends 0 ? never:T[0]
Here T["length"] extends 0
checks for the length of the array.
Solution by Anonymous961 #36962
解题思路
看到这题的时候,我下意识的这样写
type First<T extends any[]> = T[0];
但是测试用例Expect<Equal<First<[]>, never>>,
没有通过,空数组应该返回never
所以,我尝试这样写
type First<T extends any[]> = T extends [] ? never : T[0];
成功了,这里是通过extends
判断T
是否是[]
的子类型判断来T
是否为空数组,关于 extends
的这种三元表达式的用法,可以参考这里
看了下其他答案,也有比较好的写法,比如:
type First<T extends any[]> = T["length"] extends 0 ? never : T[0];
它通过T["length"]
是否是0
来判断数组是否是空数组。
还有另一个写法
type First<T extends any[]> = T extends [infer F, ...infer _] ? F : never;
关于infer
的用法,可以参考精读《Typescript infer 关键字》
题解
type First<T extends any[]> = T extends [] ? never : T[0];
// type First<T extends any[]> = T["length"] extends 0 ? never : T[0];
// type First<T extends any[]> = T extends [infer F, ...infer _] ? F : never;
心得与知识点
extends...?:
可以根据当前类型是否符合某种条件,返回不同的类型。T extends U ? X : Y
上面式子中的extends
用来判断,类型 T 是否可以赋值给类型U
,即T
是否为U
的子类型,这里的T
和U
可以是任意类型。
Solution by lkwavestian #36946
// your answers
type First<T extends any[]> = T extends [infer F, ...infer Last] ? F : never
Solution by AlexBraunMagic #36918
type First<T extends any[]> = T extends [infer first, ...infer rest] ? first : never;
Solution by shaishab316 #36841
type First<T extends any[]> = T extends [] ? never : T[0];
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<First<[3, 2, 1]>, 3>>,
Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
Expect<Equal<First<[]>, never>>,
Expect<Equal<First<[undefined]>, undefined>>,
]
type errors = [
// @ts-expect-error
First<'notArray'>,
// @ts-expect-error
First<{ 0: 'arrayLike' }>,
]
Solution by AnastasiaSv #36761
type First<T extends any[]> = T extends [] ? never : T[0];
Solution by Abdullah-Elsayed01 #36744
type First<T extends any[]> = T['length'] extends 0 ? never : T[0]
Solution by tungulin #36713
type First<T extends (string|number)[]> = T[0];
Solution by Mamdouhreda #36707
// 你的答案
type First<T extends any[]> = T extends [] ? never : T[0]
Solution by PurplePlanen #36699
type First<T extends any[]> = T extends [] ? never : T[0]
type First<T extends any[]> = T extends [infer U, ...any[]] ? U : never
Solution by seungdeok #36657
// 你的答案
type First<T extends any[]> = T['length'] extends 0 ? never : T[0]
Solution by MrSissel #36580
// 你的答案
type First<T extends any[]> = T extends []?never : T[0]
Solution by mola-fish #36575
type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never
Solution by ChemieAi #36549
// 你的答案
type First<T extends any[]> = T extends [infer U,...any[]]?U:never;
Solution by Rocco10086 #36536
type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never;
Solution by saalehpxo #36509
type First<T extends any[]> = T extends [] ? never : T[0]
Solution by UsGitHu611 #36494
type First<T extends any[]> = T extends [infer K,...infer R] ? K : never;
Solution by gakki-san #36442
type First<T extends any[]> = T extends [infer R, ...any[]] ? R : never;
Solution by alirezaprime #36411
// your answers
type First<T extends any[]> = T extends [infer U, ...infer V] ? U : never;
Solution by justBadProgrammer #36358
// 你的答案
type First<T extends any[]> =T extends [infer F,...any[]] ? F : never
Solution by ATravelerGo #36351
type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never
Solution by 1Alex4949031 #36309
type First<T extends any[]> = T extends [infer U, ...infer _K] ? U : never
Solution by Jace254 #36266
type First<T extends any[]> = T extends [infer K, ...any] ? K : never
Solution by Maxim-Do #36224
// 你的答案
type First<T extends any[]> = T extends [] ? never : T[0]
Solution by destinyliu3 #36223
type First<T extends unknown[]> = T extends [] ? never : T[0];
Solution by tjd985 #36191
type First<T extends any[]> = T['length'] extends 0 ? never : T[0];
Solution by asylbekduldiev #36177
type First<T extends any[]> = T extends [infer F, ...any[]] ? F : never;
Solution by AleksandrShcherbackov #36141
type First<T extends any[]> = T[number] extends never ? never : T[0]
/**
* 배열 길이가 0인지 확인하는 방법
*
* type First<T extends any[]> = T extends [] ? never : T[0]
* type First<T extends any[]> = T['length'] extends 0 ? never : T[0]
*/
Solution by jhsung23 #36093
type First<T extends any[]> = T["length"] extends 0 ? never : T[0]
Solution by buglavecz #36089
type First<T extends any[]> = T extends [infer FirstElement, ...any[]] ? FirstElement : never;
Solution by KimKyuHoi #36082