MST

星途 面试题库

面试题:TypeScript类型断言在复杂类型结构中的风险与规避

假设你有一个多层嵌套的复杂对象类型,如包含数组、对象和函数的混合结构。请分析在对此复杂结构进行类型断言时可能出现的风险,并提出至少两种有效的规避策略,同时编写相应的TypeScript代码示例。
43.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

风险分析

  1. 类型不匹配风险:如果断言的类型与实际对象结构不匹配,可能导致运行时错误。例如将一个不包含特定属性的对象断言为包含该属性的类型,访问该属性时会出现 undefined 错误。
  2. 丢失原有类型信息风险:过度断言可能会丢失对象原本具有的一些类型信息,使得后续代码无法正确利用这些信息进行类型检查和推导。

规避策略及代码示例

  1. 使用类型守卫
interface Animal {
    name: string;
}
interface Dog extends Animal {
    bark(): void;
}

function handleAnimal(animal: Animal) {
    if ('bark' in animal) {
        (animal as Dog).bark();
    }
}
  1. 使用 is 类型谓词
interface Fish {
    swim(): void;
}
interface Bird {
    fly(): void;
}

function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim!== undefined;
}

function handlePet(pet: Fish | Bird) {
    if (isFish(pet)) {
        pet.swim();
    } else {
        (pet as Bird).fly();
    }
}
  1. 使用 infer 关键字进行类型推断
type Flatten<T> = T extends Array<infer U> ? U : T;

interface ComplexObject {
    data: Array<{ value: string | number }>;
}

function processComplexObject(obj: ComplexObject) {
    const flatValue: Flatten<ComplexObject['data'][number]['value']> = obj.data[0].value;
    // 这里 flatValue 会根据实际值推断为 string | number
}