MST

星途 面试题库

面试题:深入探讨unknown类型在复杂类型嵌套中的类型推断及处理

给定一个复杂类型`type Complex = { prop1: unknown; prop2: { subProp: unknown[] }; prop3: { [key: string]: unknown }[] }`。有一个函数`handleComplex`,接收`Complex`类型参数。请实现该函数,能够安全地访问并处理`prop1`为数字时乘以2,`prop2.subProp`数组中每个元素为字符串时转为大写,`prop3`对象数组中每个对象如果有`name`属性且为字符串时输出问候语。详细说明在处理过程中如何利用TypeScript的类型系统确保类型安全以及处理复杂类型嵌套中unknown类型的策略。
15.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type Complex = { 
    prop1: unknown; 
    prop2: { subProp: unknown[] }; 
    prop3: { [key: string]: unknown }[] 
};

function handleComplex(data: Complex) {
    if (typeof data.prop1 === 'number') {
        data.prop1 = data.prop1 * 2;
    }

    if (Array.isArray(data.prop2.subProp)) {
        data.prop2.subProp = data.prop2.subProp.map((item) => {
            if (typeof item ==='string') {
                return item.toUpperCase();
            }
            return item;
        });
    }

    data.prop3.forEach((obj) => {
        if (typeof obj === 'object' && 'name' in obj && typeof obj.name ==='string') {
            console.log(`Hello, ${obj.name}!`);
        }
    });
}

类型安全保障

  1. 使用typeof进行类型检查:在处理prop1时,通过typeof data.prop1 === 'number'确保只有当prop1是数字类型时才进行乘法操作。对于prop2.subProp中的元素,使用typeof item ==='string'判断是否为字符串从而进行大写转换。在处理prop3时,通过typeof obj === 'object' && 'name' in obj && typeof obj.name ==='string'确保对象存在且有name属性并且name是字符串类型时输出问候语。
  2. 数组检查:使用Array.isArray(data.prop2.subProp)确保subProp是数组类型才进行遍历和元素处理,避免非数组类型导致的运行时错误。

处理unknown类型的策略

  1. 不直接操作unknown类型:对于Complex类型中的unknown类型属性,不直接进行操作。而是先通过typeof或其他类型守卫(如Array.isArray)将其缩小到具体的已知类型后再进行操作。这样可以利用TypeScript的类型系统在编译时捕获潜在的类型错误,保证代码的类型安全性。例如在处理prop1时,只有在确认其为number类型后才进行乘法运算;处理prop2.subProp数组元素时,只有确认元素为string类型后才进行大写转换;处理prop3对象中的name属性时,确认对象存在、name属性存在且为string类型后才输出问候语。