t-comm
Version:
专业、稳定、纯粹的工具库
52 lines (49 loc) • 1.9 kB
JavaScript
import _typeof from '@babel/runtime/helpers/typeof';
/**
* 高度可配置的参数获取函数。
* 它根据提供的参数名列表,智能地将分散参数或对象参数转换为一个标准化的对象。
*
* @template T - 期望返回的对象类型。
* @param {string[]} paramNames - 参数名列表,用于映射分散的参数。
* @param {any[]} args - 原始的函数参数 `arguments`。
* @returns {T} - 一个标准化的对象。
* @example
* ```ts
* // 1. 分散参数:按 paramNames 顺序映射
* function foo(a: string, b: number, c: boolean) {
* return getParameters<{ a: string; b: number; c: boolean }>(
* ['a', 'b', 'c'],
* // eslint-disable-next-line prefer-rest-params
* [...arguments],
* );
* }
* foo('x', 1, true); // { a: 'x', b: 1, c: true }
*
* // 2. 对象参数:原样返回
* function bar(opts: { a: string; b: number }) {
* return getParameters<{ a: string; b: number }>(
* ['a', 'b'],
* // eslint-disable-next-line prefer-rest-params
* [...arguments],
* );
* }
* bar({ a: 'x', b: 1 }); // { a: 'x', b: 1 }
* ```
*/
function getParameters(paramNames) {
var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
// 规则1: 如果只传入了一个参数,并且这个参数是一个对象(非 null/数组),
// 则认为它是一个完整的参数对象,直接返回。
if (args.length === 1 && _typeof(args[0]) === 'object' && args[0] !== null && !Array.isArray(args[0])) {
return args[0];
}
// 规则2: 否则,认为传入的是分散的参数。
// 使用 `paramNames` 列表将 `args` 数组映射成一个新对象。
var result = {};
paramNames.forEach(function (name, index) {
// 将 args 中对应位置的值赋给新对象的同名属性
result[name] = args[index];
});
return result;
}
export { getParameters };