00015-medium-last

Back

type Last<T extends any[]> = T extends [...infer P, infer L] ? L : never;

Solution by nupthale #33581

type Last<T extends any[]> = T extends [infer F, ...infer Rest] ? Rest[number] extends never ? F : Last<Rest> : never

Solution by Flavour86 #33449

// 你的答案
type Last<T extends any[]> = T extends [...infer P, infer R] ? R : never

Solution by shaobeichen #33372

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

Solution by chenghao125 #33296

// your answers

type Last<T extends unknown[]> = T extends [...unknown[], infer Last] ? Last : never

Solution by KeithChou #33133

type Last<T extends unknown[]> = T['length'] extends [0]['length']
  ? T[0]
  : T extends [any, ...any, infer Last]
  ? Last
  : never;

Solution by Taneros #32974

// 你的答案
type Last<T extends any[]> = T extends [infer F,...infer O] ? O extends [] ? F : Last<O> 
: never

Solution by walker-hzx #32935

/* 
解法一  与14First相反 
举例来说,如果你有 type arr1 = ['a', 'b', 'c'],那么 Last<arr1> 类型就相当于 ['any', 'a', 'b', 'c'],
然后取 arr1.length(3)作为索引,也就是数组的最后一个元素 'c',所以 Last<arr1> 的结果类型就是 'c'。
*/
type Last<T extends any[]> =  [any, ...T][T['length']]

Solution by CAN1177 #32857

// 解答をここに記入
type Last<T extends any[]> = T extends [...infer A, infer B]
  ? B
  : never;

Solution by Yasunori-aloha #32824

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

Solution by ZhipengYang0605 #32798

type Last<T> = T extends [...args:any[], infer S] ? S : never;

Solution by malyanoff #32779

type Last<T extends any[]> =T extends [...infer first , infer last] ? last :never

Solution by bananana0118 #32733

type Last<T extends unknown[]> = T extends [...infer Prev, infer Last] ? Last : never

type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]

type tail1 = Last<arr1> // expected to be 'c'
type tail2 = Last<arr2> // expected to be 1

Solution by ZhulinskiiDanil #32671

这道题又完全想偏了,一开始采用 car & cdr 的链表思维,通过递归实现:

type Last<T> = T[1] extends T[number] ?  Last<Omit<T, 0>> : T[0];

但是这样根本递归不了,因为没有办法构建出一个新数组类型传给下层。

后来看了题目,提醒用 TS 4.0,就去查了一下 4.0 支持的新语法 ... 符号。折磨一通,结果如下:

type Last<T extends unknown[], L extends T[number]> = [...T, L] extends T ? L : never;

看了别人的答案之后,才发现,原来如此简单。解决思路就是利用 ... 符号,任意添加一个元素,构建一个新 Tuple 类型,把原来的 Tuple 追加到后面。那么原来 Tuple 的 length 就刚好指向新 Tuple 的最后一个元素。这个元素也是 原 Tuple 的最后一个元素。

type Last<T extends readonly unknown[]> = [unknown, ...T][T['length']];

Solution by mistkafka #32640

// 你的答案
T extends [...infer U, infer P] ? P : never;

Solution by DOIT008 #32527

// your answers
type Last<T extends any[]> = T extends [...any[],infer R] ? R :never

Solution by YuFengDing #32526

 type Last<T extends any[]> = T extends [...rest:any[],infer L] ? L: never;

Solution by samyakrt #32509

// your answers

type arr11 = ['a', 'b', 'c']
type arr22 = [3, 2, 1]

type LastOfArray<T extends any[]> = T extends [...infer R, infer L] ? L : never


type a = LastOfArray<arr11> // expected to be 'c'
type b = LastOfArray<arr22> // expected to be 1

Solution by laqudee #32345

type Last<TArray extends unknown[]> = TArray extends [...infer Rest, infer Last]
  ? Last
  : never

Solution by LwveMike #32245

type Last<T extends unknown[]> = T extends [unknown, ...infer Rest] ? T[Rest['length']] : never;

Solution by dev-hobin #32229

type Last<T extends any[]> =
  T extends [...any, infer L]
  ? L
  : never

We check if we can infer a last element from T if this extends from an array that have at least one element, if that is the case, then we type as the already inferred type L, otherwise we type as never

Solution by joyanedel #32152

// your answers
type Last<T extends any[]> = T extends [...any[], infer Last] ? Last : any

Solution by trinhvinhtruong96 #32066

type Last<T extends unknown[]> = [unknown, ...T][T["length"]]

Solution by rkamely #32053

type Last<T extends any[]> = T["length"] extends 1
	? T extends [infer F]
		? F
		: never
	: T extends [infer _, ...infer L]
	? Last<L>
	: never;

Solution by gasmg #32003

type Last<T extends any[]> = T extends [infer F, ...infer R] ? R["length"] extends 0 ? F : Last<R> : never

Solution by dbfu #31996

type Last<T extends any[]> = T extends [...infer _, infer L] ? L : never

Solution by Tap-Kim #31991

// your answers
type Last<T extends any[]> = T extends [infer First, ...infer Rest] ? Rest extends never[] ? First : Last<Rest> : never;

Solution by nkeyy0 #31891

// your answers
type Last<T extends any[]> = T extends [...any[],infer U]? U:never;

Solution by pea-sys #31873

type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]

type tail1 = Last<arr1> // expected to be 'c'
type tail2 = Last<arr2> // expected to be 1

type Last<A extends unknown[]> = A extends [...unknown[], infer U] ? U : never

Solution by anovicenko74 #31769

type Last<T extends any[]> = T extends [...any, infer L] ?  L : never;

Solution by kai-phan #31621