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