// 辅助类型,判断值是否为数值
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;
});
}