MST
星途 面试题库

面试题:TypeScript泛型函数中类型推断的专家级难题

考虑以下TypeScript泛型函数: ```typescript type ReturnFirst<T extends any[]> = T extends [infer First, ...infer Rest] ? First : never; function getFirst<T extends any[]>(arr: T): ReturnFirst<T> { return arr[0]; } let result1 = getFirst([1, 2, 3]); let result2 = getFirst(['a', 'b', 'c']); ``` 1. 详细解释`ReturnFirst`类型别名和`getFirst`函数中类型推断的原理及过程。 2. 假设我们想让`getFirst`函数能够处理空数组,并返回`undefined`,应该如何修改`ReturnFirst`类型别名和`getFirst`函数,同时保证类型推断的正确性?
29.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. ReturnFirst类型别名和getFirst函数中类型推断的原理及过程

  • ReturnFirst类型别名
    • T extends any[]表示T是一个数组类型。
    • T extends [infer First, ...infer Rest]使用类型推断,infer First推断出数组T的第一个元素类型,infer Rest推断出除第一个元素外剩余元素组成的数组类型。
    • 如果T是一个非空数组,满足[infer First, ...infer Rest]模式,就返回First,即数组的第一个元素类型;否则返回never,表示空数组或者非数组类型的情况。
  • getFirst函数
    • function getFirst<T extends any[]>(arr: T)声明函数getFirst接受一个类型为T的数组参数arr,且T必须是数组类型。
    • : ReturnFirst<T>表示函数返回值类型是ReturnFirst<T>,也就是T数组的第一个元素类型。
    • 当调用getFirst([1, 2, 3])时,T被推断为number[]ReturnFirst<number[]>推断为number,所以函数返回值类型为number,实际返回1。同理,getFirst(['a', 'b', 'c'])T被推断为string[]ReturnFirst<string[]>推断为string,函数返回值类型为string,实际返回'a'

2. 修改ReturnFirst类型别名和getFirst函数以处理空数组并返回undefined

type ReturnFirst<T extends any[]> = T extends [infer First, ...infer Rest] ? First : undefined;

function getFirst<T extends any[]>(arr: T): ReturnFirst<T> {
    return arr.length > 0 ? arr[0] : undefined;
}
  • ReturnFirst类型别名:将原来返回never的情况改为返回undefined,这样当数组为空时,返回值类型为undefined
  • getFirst函数:在函数体中添加判断,如果数组长度大于0,返回第一个元素;否则返回undefined,以匹配修改后的ReturnFirst类型别名。