// 利用剩余参数结合泛型实现通用函数
function createInfoObject<T extends any[]>(...args: T): {
parameterCount: number;
parameterTypes: (string | undefined)[];
data: T;
} {
// 获取参数类型
const parameterTypes = args.map(arg => typeof arg);
return {
parameterCount: args.length,
parameterTypes,
data: args
};
}
// 类型推断过程:
// 1. 定义泛型T,它被约束为any[]类型的数组,用来表示传入参数的类型。
// 2. 使用剩余参数...args: T来接收任意数量和类型的参数,这样T就会根据传入的实际参数类型进行推断。
// 3. 在函数内部,通过map方法遍历args数组,使用typeof获取每个参数的类型,并存储在parameterTypes数组中。
// 4. 最后返回一个对象,对象中包含参数数量、参数类型数组以及原始数据数组,精准地体现了传入参数的类型信息。
// 示例调用
const result = createInfoObject(1, 'hello', true);
console.log(result.parameterCount); // 3
console.log(result.parameterTypes); // ['number', 'string', 'boolean']
console.log(result.data); // [1, 'hello', true]
- 泛型应用:
- 定义了泛型
T
,并约束为 any[]
类型,这样 T
就会根据传入的实际参数数组类型进行推断。
- 在函数返回类型中使用
T
,确保返回的 data
属性与传入的参数类型保持一致。
- 类型推断:
- 当调用
createInfoObject
函数并传入参数时,TypeScript 会根据传入参数的类型推断出 T
的具体类型。
- 例如,传入
(1, 'hello', true)
,T
会被推断为 [number, string, boolean]
,这样整个函数的返回类型也会根据这个推断结果进行确定,保证了类型的精准性。