MST

星途 面试题库

面试题:复杂场景下TypeScript类型推断的优化

假设有一个复杂的业务场景,存在多个嵌套的函数调用和类型转换。例如,有一个函数`processData`,它接收一个混合类型的对象数组,数组元素可能包含`string`、`number`、`boolean`以及自定义类型的属性。`processData`函数需要对这些数据进行过滤、转换和合并操作,最终返回一个特定结构的对象。请编写此函数,并优化类型推断,确保代码在各种情况下都能正确推断类型,同时说明在这种复杂场景下优化类型推断的难点和解决方案。
34.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

代码实现

interface CustomType {
    // 假设自定义类型有个name属性
    name: string;
}

function processData(data: (string | number | boolean | CustomType)[]): { result: (string | number | boolean | CustomType)[] } {
    // 过滤操作
    const filteredData = data.filter(item => {
        if (typeof item === 'number') {
            return item > 10;
        }
        return true;
    });

    // 转换操作
    const transformedData = filteredData.map(item => {
        if (typeof item === 'string') {
            return item.toUpperCase();
        }
        return item;
    });

    // 合并操作
    const mergedData = { result: transformedData };

    return mergedData;
}

优化类型推断的难点

  1. 混合类型处理:数据包含多种不同类型,TypeScript 很难自动准确推断在各种操作后数据的具体类型,例如在mapfilter操作中,返回值类型需要精确匹配原始数据类型的子集。
  2. 嵌套函数调用:多个函数的嵌套调用使得类型传播变得复杂,每一步函数调用的返回值类型需要准确传递给下一个函数,否则类型推断可能出错。
  3. 自定义类型交互:当存在自定义类型时,与基本类型混合使用,需要确保自定义类型的属性和方法在操作中被正确识别和推断,例如自定义类型CustomTypename属性在操作中不能丢失类型信息。

解决方案

  1. 明确类型定义:通过接口(如CustomType的定义)明确自定义类型的结构,使 TypeScript 能够准确推断相关操作的类型。
  2. 类型断言:在某些情况下,当 TypeScript 无法自动推断出正确类型时,可以使用类型断言来明确指定类型,例如(item as string).toUpperCase(),但要谨慎使用,避免过度断言导致类型安全问题。
  3. 使用泛型:在函数定义中使用泛型可以使函数更通用,同时有助于类型推断,例如mapfilter函数本身就是基于泛型实现,能更好地保持类型一致性。
  4. 逐步构建和检查:将复杂操作拆分成多个步骤,每一步进行类型检查,确保类型在传递过程中保持正确,这样可以更容易发现和解决类型推断的问题。