MST

星途 面试题库

面试题:TypeScript自定义类型守卫的复杂类型应用

假设有一个数组,其中可能包含字符串、数字和对象类型的数据。请编写一个TypeScript自定义类型守卫函数,用于筛选出数组中的对象类型元素,并确保对象具有 'name' 字符串属性和 'age' 数字属性。同时说明在这种情况下类型断言与类型守卫的区别。
28.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 自定义类型守卫函数
function isObjectWithNameAndAge(value: any): value is { name: string; age: number } {
    return typeof value === 'object' && 'name' in value && typeof value.name ==='string' && 'age' in value && typeof value.age === 'number';
}

// 使用示例
const mixedArray: (string | number | { name: string; age: number })[] = ['hello', 42, { name: 'John', age: 30 }];
const filteredArray = mixedArray.filter(isObjectWithNameAndAge);
console.log(filteredArray);

类型断言与类型守卫的区别

  1. 类型断言
    • 定义:类型断言是一种手动告诉编译器某个变量的类型的方式。它只是开发者对类型的一种“假设”,编译器不会在运行时进行检查。
    • 语法:在TypeScript中,类型断言有两种语法形式:<Type>valuevalue as Type。例如 (document.getElementById('myElement') as HTMLDivElement).innerHTML = 'Hello';。这里开发者明确告诉编译器 getElementById 返回的元素是 HTMLDivElement 类型,即使编译器可能无法确定。
    • 特点:类型断言不进行运行时检查,它纯粹是为了帮助编译器进行类型检查,防止编译时的类型错误。如果断言错误,在运行时可能会导致错误,因为运行时并不会验证断言的正确性。
  2. 类型守卫
    • 定义:类型守卫是一个运行时检查,它允许开发者在运行时缩小变量的类型范围。类型守卫函数返回一个布尔值,并且使用类型谓词 parameterName is Type 的形式,告诉编译器当函数返回 true 时,参数的类型是什么。
    • 示例:上面代码中的 isObjectWithNameAndAge 函数就是一个类型守卫。当这个函数对某个值返回 true 时,编译器就知道这个值的类型是 { name: string; age: number }
    • 特点:类型守卫在运行时执行检查,确保类型的正确性。这使得代码在处理不同类型的数据时更加安全,因为它可以在运行时排除不符合预期类型的值。