MST

星途 面试题库

面试题:TypeScript联合类型与交叉类型在泛型及类型推断中的深度应用

编写一个泛型函数,该函数接受两个参数,第一个参数是一个联合类型的数组(数组元素类型为T1 | T2),第二个参数是一个类型谓词函数,用于判断数组元素到底是T1类型还是T2类型。函数返回值是一个交叉类型,它既包含一个属性`countT1`表示T1类型元素的数量,又包含一个属性`countT2`表示T2类型元素的数量。请详细写出TypeScript代码,包括类型定义、函数实现,并阐述你在实现过程中如何利用类型推断来增强代码的灵活性和可读性。
23.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义类型谓词函数类型
type TypePredicate<T, U> = (value: T | U) => value is T;

// 泛型函数实现
function countTypes<T1, T2>(arr: (T1 | T2)[], typePredicate: TypePredicate<T1, T2>): { countT1: number; countT2: number } {
    let countT1 = 0;
    let countT2 = 0;
    for (let item of arr) {
        if (typePredicate(item)) {
            countT1++;
        } else {
            countT2++;
        }
    }
    return { countT1, countT2 };
}

类型推断增强代码灵活性和可读性的阐述

  1. 参数类型推断:泛型参数T1T2由传入的数组元素类型和类型谓词函数自动推断,无需手动指定。比如调用countTypes([1, 'a'], (value): value is number => typeof value === 'number'),TypeScript 能根据传入的数组元素和类型谓词推断出T1numberT2string,使代码调用更简洁。
  2. 返回值类型推断:函数返回值类型{ countT1: number; countT2: number }无需手动声明,TypeScript 会根据函数内部逻辑推断出返回值类型,增强了代码的可读性,调用者无需关注具体实现就能知道返回值结构。