TS推断数组最后一个元素的类型ArrayLastType<T>

推断数组最后一个元素的内型

let arr = [1,2,3,true,{name:"join",age:18}] as const
type arrLastTypeA = ArrayLast<typeof arr>
type arrLastTypeB = ArrayLast<[1,2,3,true,{name:"join",age:18}]>
//预期: {name:string, age:number}

实现

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

知识点

为什么要在数组 arr 后面断言 as const

  • let arr = [....] 定义一个运行时的值,而非类型,推导为:普通数组(长度可变,类型宽泛);
  • let arr = [...] as const 推导为:只读元组(长度固定,类型精确)
  • 不加 as const arrLastType 为 never,原因是 ArrayLast 不能给可变数组推断最后一个元素的类型;

为什么ArrayLast 需要用typeof?

  • let arr = [....] 是JS运行时候的值,而非类型, 需要用typeof 取出arr的类型 TS才能进行类型系统的判断;
  • arrLastTypeB 不用typeof能争取工作的原因放到 <>已经是TS字面量类型了,所以不需要转换了

为什么需要在泛型约束和条件里面使用 readonly ?

  • T extends readonly any[]: 管理什么样的数据可以进来;
  • T extends readonly [...any[], infer L]: 怎么解构T;

readonly any[] 和any[]

  • any[]类型的值可以赋值给readonly[]
let a:any[] = [1,2,3,4,5];
let b: readonly any[] = a;
// b 在类型层面(编译时)被赋予了只读约束,禁止通过 b 修改数据;但数据本身在运行时依然是可变的,通过 a 修改会影响 b。

JavaScript中的const理解

  • 表示引用不能变,不是值不可以变
const a = [1,2,3,4,5];
let b = [];
a = b;// 错误
a[0]='string';//正确
posted @ 2026-07-19 15:14  一个行走者  阅读(7)  评论(0)    收藏  举报