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
- 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';//正确

浙公网安备 33010602011771号