面试题答案
一键面试interface A {
type: 'A';
// 其他属性
}
interface B {
type: 'B';
// 其他属性
}
interface C {
type: 'C';
// 其他属性
}
function filterByType<T, U extends T>(array: T[], typePredicate: (element: T) => element is U): U[] {
return array.filter(typePredicate);
}
// 示例使用
const mixedArray: (A | B | C)[] = [
{ type: 'A' },
{ type: 'B' },
{ type: 'C' }
];
const filteredArray = filterByType(mixedArray, (element): element is A => element.type === 'A');
类型守卫的作用
类型守卫是一个运行时检查,它允许我们在特定代码块中细化类型。在上述代码中,typePredicate
函数就是一个类型守卫。通过element is U
这种语法,TypeScript能够在filter
方法内部的回调中,根据typePredicate
的返回值,确定当前元素的具体类型。这样在回调内部,element
就被细化为U
类型,从而保证filter
方法返回的数组元素类型是U
类型。
条件类型的作用
在函数定义filterByType<T, U extends T>(array: T[], typePredicate: (element: T) => element is U): U[]
中,并没有直接使用到条件类型。但是条件类型通常用于根据类型关系进行类型推导,在更复杂的场景下,比如当需要根据不同类型做不同处理时,条件类型可以派上用场。例如,如果要对不同类型的元素做不同的映射处理,可以利用条件类型来推导映射后的具体类型。但在这个简单的过滤场景中,类型守卫足以完成精确类型推导的任务。