面试题答案
一键面试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
类型别名。