面试题答案
一键面试类型守卫的适用场景及示例
- 场景:当需要在运行时检查数据类型,以确保代码在特定类型下安全执行时,优先使用类型守卫。比如在处理来自外部数据源(如API响应)的数据,数据类型可能不明确,但需要根据不同类型进行不同处理。
- 示例:
interface Bird {
fly: () => void;
layEggs: () => void;
}
interface Fish {
swim: () => void;
layEggs: () => void;
}
function handleAnimal(animal: Bird | Fish) {
if ('fly' in animal) {
animal.fly();
} else {
animal.swim();
}
animal.layEggs();
}
在上述代码中,'fly' in animal
就是一个类型守卫。通过这种方式,可以在运行时检查 animal
的实际类型,从而安全地调用相应的方法,提高代码的安全性和可维护性。
类型断言的适用场景及示例
- 场景:当开发者明确知道某个值的类型,并且编译器无法自动推断出正确类型时,优先使用类型断言。比如在使用某些第三方库,其返回值类型定义不完整,但开发者清楚其实际类型。
- 示例:
// 假设getElementById的返回值类型为HTMLElement | null
const myDiv = document.getElementById('myDiv') as HTMLDivElement;
myDiv.innerHTML = 'Hello';
在这个例子中,document.getElementById
返回的类型是 HTMLElement | null
,但开发者明确知道页面上存在 id
为 myDiv
的 div
元素,所以使用类型断言 as HTMLDivElement
来告诉编译器该元素实际类型为 HTMLDivElement
,这样可以直接访问 innerHTML
属性,优化了代码结构,提高了可读性。但要注意,如果断言错误,会导致运行时错误,所以使用时需谨慎。
总结
在大型TypeScript项目中,合理运用类型守卫和类型断言能有效优化代码结构、提高可读性和可维护性并减少潜在类型错误。类型守卫用于运行时类型检查,类型断言用于开发者明确类型但编译器无法推断的情况。在编写代码时,应根据具体场景准确选择,确保代码既安全又简洁。