MST
星途 面试题库

面试题:TypeScript 类型推断与显式类型声明在泛型和高阶函数中的深度权衡

编写一个高阶函数,该函数接受一个泛型函数作为参数,并返回一个新的函数。新函数需要对传入泛型函数的参数和返回值进行类型处理。请详细阐述在这个过程中,类型推断和显式类型声明如何相互作用,以及在不同业务场景下如何选择更合适的方式,以确保代码的健壮性和可扩展性。同时,分析过度使用或不恰当使用其中一种方式可能带来的问题。
40.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

代码实现

// 定义高阶函数
function higherOrderFunction<T, U>(fn: (arg: T) => U): (arg: T) => U {
    return function (arg: T): U {
        // 这里可以对参数和返回值进行类型处理
        return fn(arg);
    };
}

// 示例泛型函数
function addNumbers(a: number, b: number): number {
    return a + b;
}

// 使用高阶函数包装示例函数
const newAddNumbers = higherOrderFunction(addNumbers);
const result = newAddNumbers(1, 2);

类型推断与显式类型声明的相互作用

  1. 类型推断:TypeScript 能够根据代码上下文自动推断类型。例如在上述代码中,higherOrderFunction 的类型参数 TU 会根据传入的 addNumbers 函数的参数和返回值类型自动推断。这减少了显式声明类型的工作量,使代码更简洁。
  2. 显式类型声明:在某些情况下,显式声明类型可以增加代码的可读性和清晰度。比如在函数参数或返回值类型复杂时,显式声明可以让开发者更直观地理解代码意图。例如,如果 addNumbers 函数参数类型是一个复杂的对象类型,显式声明参数类型可以避免潜在的类型错误。

不同业务场景下的选择

  1. 简单场景:对于简单的函数和逻辑,类型推断通常就足够了。例如基本的数学运算函数,类型推断能够快速准确地确定类型,使代码简洁易读。
  2. 复杂场景:在涉及复杂数据结构、接口或者函数重载的场景下,显式类型声明更为合适。比如处理一个包含多层嵌套对象的函数,显式声明参数和返回值类型能确保代码的健壮性,减少运行时错误。

过度使用或不恰当使用的问题

  1. 过度使用显式类型声明:会使代码变得冗长且难以维护。每次类型有变动时,都需要在多个显式声明处进行修改,增加了出错的可能性。
  2. 不恰当使用类型推断:在复杂场景下,如果完全依赖类型推断,可能导致类型错误难以排查。由于没有显式声明类型,一旦类型出现问题,很难快速定位错误源头。