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