MST
星途 面试题库

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

假设有一个联合类型`type Animal = { type: 'dog'; name: string; bark: () => void } | { type: 'cat'; name: string; meow: () => void };` 请编写一个自定义类型保护函数,该函数接收`Animal`类型的参数,能够判断传入的对象是`dog`还是`cat`,并在使用类型保护后,正确调用相应对象的方法,同时阐述这种类型保护实现的原理。
23.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function isDog(animal: Animal): animal is { type: 'dog'; name: string; bark: () => void } {
    return animal.type === 'dog';
}

function handleAnimal(animal: Animal) {
    if (isDog(animal)) {
        animal.bark();
    } else {
        animal.meow();
    }
}

类型保护实现原理

  1. 类型谓词:在isDog函数中,使用了类型谓词 animal is { type: 'dog'; name: string; bark: () => void }。它的作用是告诉TypeScript编译器,当isDog函数返回true时,传入的animal参数实际上就是{ type: 'dog'; name: string; bark: () => void }类型。
  2. 缩小类型范围:通过if (isDog(animal))这样的条件判断,在if代码块内,TypeScript会基于isDog函数的返回值,将animal的类型范围缩小为{ type: 'dog'; name: string; bark: () => void },从而可以安全地调用bark方法。在else代码块内,animal的类型就被缩小为{ type: 'cat'; name: string; meow: () => void },可以安全调用meow方法。这种机制使得在联合类型中能够精确地处理不同类型的对象,提高代码的类型安全性。