MST

星途 面试题库

面试题:TypeScript泛型与映射类型在函数重载与类型分发中的深度应用

编写一组TypeScript函数重载,使用泛型和映射类型实现一个 `processData` 函数。该函数接受一个对象数组,对象的属性根据不同的条件进行处理。例如,如果对象有 `isNumeric` 属性且为 `true`,那么将其所有数值属性翻倍;如果 `isString` 属性为 `true`,则将所有字符串属性转换为大写。要求精确地定义函数的输入输出类型,充分利用泛型和映射类型来实现类型的灵活分发与处理。
41.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 辅助类型,判断值是否为数值
type IsNumeric<T> = T extends number ? true : false;
// 辅助类型,判断值是否为字符串
type IsString<T> = T extends string ? true : false;

// 函数重载定义
function processData<T extends { isNumeric: true }[]>(data: T): { [K in keyof T[0]]: IsNumeric<T[0][K]> extends true ? T[0][K] extends number ? number : never : T[0][K] }[];
function processData<T extends { isString: true }[]>(data: T): { [K in keyof T[0]]: IsString<T[0][K]> extends true ? T[0][K] extends string ? string : never : T[0][K] }[];
function processData<T>(data: T[]): T[];

// 函数实现
function processData<T>(data: T[]): T[] {
    return data.map((item) => {
        if ('isNumeric' in item && item.isNumeric) {
            return Object.keys(item).reduce((acc, key) => {
                const value = item[key as keyof typeof item];
                if (typeof value === 'number') {
                    acc[key as keyof typeof item] = value * 2;
                } else {
                    acc[key as keyof typeof item] = value;
                }
                return acc;
            }, {} as { [K in keyof typeof item]: IsNumeric<typeof item[K]> extends true ? typeof item[K] extends number ? number : never : typeof item[K] });
        } else if ('isString' in item && item.isString) {
            return Object.keys(item).reduce((acc, key) => {
                const value = item[key as keyof typeof item];
                if (typeof value ==='string') {
                    acc[key as keyof typeof item] = value.toUpperCase();
                } else {
                    acc[key as keyof typeof item] = value;
                }
                return acc;
            }, {} as { [K in keyof typeof item]: IsString<typeof item[K]> extends true ? typeof item[K] extends string ? string : never : typeof item[K] });
        }
        return item;
    });
}