MST

星途 面试题库

面试题:TypeScript 静态类型系统下泛型与条件类型的深度应用

编写一个 TypeScript 工具类型 `IfEquals<A, B, X, Y>`,当类型 `A` 和 `B` 相等时,结果为类型 `X`,否则为类型 `Y`。然后基于此工具类型,编写一个泛型函数 `filterByType`,该函数接收一个数组和一个类型标识,返回数组中符合该类型标识的元素组成的新数组。例如,`filterByType<number | string>([1, 'a', 2], 'number')` 应返回 `[1, 2]`。要求清晰注释每一步实现逻辑。
32.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义工具类型IfEquals,用于判断两个类型是否相等
// 如果A和B相等,返回X,否则返回Y
type IfEquals<A, B, X, Y> = (<T>() => T extends A? 1 : 2) extends (<T>() => T extends B? 1 : 2)? X : Y;

// 定义泛型函数filterByType
// T为数组元素可能的类型联合,K为类型标识
function filterByType<T, K extends keyof { [P in T as `${P}`]: P }>(
    arr: T[], 
    type: K
): IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>> {
    // 如果类型标识是'number'
    if (type === 'number') {
        return arr.filter((item): item is number => typeof item === 'number') as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
    } 
    // 如果类型标识是'string'
    else if (type ==='string') {
        return arr.filter((item): item is string => typeof item ==='string') as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
    } 
    // 其他情况返回空数组(这里实际类型是never,只是示例需要返回空数组)
    return [] as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
}