MST

星途 面试题库

面试题:TypeScript自定义类型守卫在泛型和递归中的运用

编写一个TypeScript函数,该函数接受一个泛型类型的数组,数组元素可能是基本类型或者嵌套的数组(嵌套层级不定)。使用自定义类型守卫和递归,实现一个函数来确保所有的叶子节点(基本类型元素)都是数字类型,并处理可能出现的类型错误情况。阐述你在实现过程中对类型系统和类型守卫机制的深度理解。
39.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 自定义类型守卫
function isNumberArray(arr: any): arr is number[] {
    return Array.isArray(arr) && arr.every((element) => typeof element === 'number');
}

function isNumber(value: any): value is number {
    return typeof value === 'number';
}

function ensureAllNumbers<T>(arr: T[]): boolean {
    for (const element of arr) {
        if (Array.isArray(element)) {
            if (!ensureAllNumbers(element)) {
                return false;
            }
        } else if (!isNumber(element)) {
            throw new Error('Non - number leaf node found');
        }
    }
    return true;
}

对类型系统和类型守卫机制的深度理解

  1. 类型系统:TypeScript 的类型系统是静态的,这意味着在编译时就能检查出类型错误,提高代码的可靠性和可维护性。在这个函数中,通过泛型 T 来表示数组元素的类型,使得函数可以接受任意类型的数组。类型系统会确保我们在函数内部对不同类型的操作是安全的,例如在 isNumberArrayisNumber 类型守卫中,通过 typeof 操作符来检查类型是否符合预期。
  2. 类型守卫机制:类型守卫是一种运行时检查机制,用于缩小变量的类型范围。在 isNumberArrayisNumber 函数中,通过 return 语句返回布尔值来判断变量是否属于特定类型。在 ensureAllNumbers 函数中,通过 if 语句结合类型守卫来处理不同类型的元素。如果是数组元素,则递归调用 ensureAllNumbers 进一步检查;如果是基本类型元素,通过 isNumber 类型守卫判断是否为数字,若不是则抛出错误。这种机制让我们可以在运行时安全地处理不同类型的元素,同时保持类型系统的约束。