MST

星途 面试题库

面试题:TypeScript自定义类型保护在复杂对象结构中的应用

假设有一个包含多种类型的数组,其中可能有字符串、数字和一个具有 `name` 属性的对象。请编写自定义类型保护函数,能够从数组中筛选出具有 `name` 属性的对象,并详细说明类型保护函数在这个过程中的类型推断机制。
11.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 编写类型保护函数
function isObjectWithName(value: any): value is { name: string } {
    return typeof value === 'object' && 'name' in value && typeof value.name ==='string';
}

function filterObjectsWithName(arr: (string | number | { name: string })[]): { name: string }[] {
    return arr.filter(isObjectWithName);
}
  1. 类型推断机制说明
    • isObjectWithName 函数中,通过 typeof value === 'object' 首先判断 value 是一个对象。然后,使用 'name' in value 确保对象有 name 属性,最后通过 typeof value.name ==='string' 确定 name 属性的值是字符串类型。通过这些条件组合,isObjectWithName 函数可以准确判断传入的值是否是具有 name 属性且值为字符串的对象。
    • filterObjectsWithName 函数中,调用 arr.filter(isObjectWithName) 时,TypeScript 会利用 isObjectWithName 这个类型保护函数的返回值类型(value is { name: string })来进行类型推断。filter 方法会对数组中的每个元素调用 isObjectWithName,如果返回 true,则该元素会被保留在结果数组中,并且在结果数组中,TypeScript 能够推断出这些元素的类型是 { name: string }。所以最终 filterObjectsWithName 函数返回的数组类型就是 { name: string }[]