MST

星途 面试题库

面试题:TypeScript中unknown类型在复杂类型嵌套中的类型缩小与类型守卫应用

假设有一个类型为unknown的变量,它可能是一个包含多种嵌套结构的对象,比如{ data: { items: string[] | number[] } }这种形式。请通过类型守卫和类型缩小的方式,编写代码来安全地访问items数组中的元素,并对元素执行不同操作(字符串元素转换为大写,数字元素加倍),同时保证代码的类型安全性,解释每一步类型处理的原理。
37.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function processUnknownValue(value: unknown) {
    // 使用类型守卫,判断value是否是对象且包含data属性
    if (typeof value === 'object' && value!== null && 'data' in value) {
        const data = value.data;
        // 使用类型守卫,判断data是否包含items属性
        if ('items' in data) {
            const items = data.items;
            // 使用类型缩小,判断items是string数组
            if (Array.isArray(items) && items.every(item => typeof item ==='string')) {
                return items.map(item => item.toUpperCase());
            } 
            // 使用类型缩小,判断items是number数组
            else if (Array.isArray(items) && items.every(item => typeof item === 'number')) {
                return items.map(item => item * 2);
            }
        }
    }
    return null;
}

// 解释:
// 1. `typeof value === 'object' && value!== null && 'data' in value`:这是一个类型守卫,
//    确保value是一个对象且包含data属性,这样才能安全访问data。
// 2. `'items' in data`:进一步类型守卫,确保data对象包含items属性,才能访问items。
// 3. `Array.isArray(items) && items.every(item => typeof item ==='string')`:
//    这是类型缩小,确认items是一个数组且数组中所有元素都是字符串类型,此时就能安全地调用字符串的toUpperCase方法。
// 4. `Array.isArray(items) && items.every(item => typeof item === 'number')`:
//    同样是类型缩小,确认items是一个数组且数组中所有元素都是数字类型,此时就能安全地对数字元素加倍。