我想做什么
我想要编写一个JavaScript函数,可以通过第二个参数重新映射第一个参数的属性名。
我使用这个重映射函数来创建查询字符串参数。例如,从 { param1: 1, param2: 2, param3: 3}
到 ?p1=1&p2=2&p3=3
。
/**
* @example
*
* const original = { a: 1, b: 'WOW', c: new Date(2019, 1, 1, 0, 0, 0) };
* const mapping = { a: 'hello', b: 'world', c: '!!!' };
*
* > remap(original, mapping);
* { hello: 1, world: 'WOW', '!!!': new Date(2019, 1, 1, 0, 0, 0) }
*/
const remap = (original, mapping) => {
const remapped = {};
Object.keys(original).forEach(k => {
remapped[mapping[k]] = original[k];
});
return remapped;
};
我的有缺陷的代码
我尝试过以下代码,但是它是有缺陷的。
export const remap = <
T extends { [key: string]: any },
U extends { [P in keyof T]: string }
>(original: T, mapping: U) => {
const remapped: any = {};
Object.keys(original).forEach(k => {
remapped[mapping[k]] = original[k];
});
// Problems
// 1. remapped is declared as any, and cast required.
// 2. All values are declared ad any.
return remapped as { [P in keyof U]: any };
};
const remapped = remap(
{ a: 1, b: 'text', c: new Date() },
{ a: 'Hello', b: 'World', c: '!!!' }
);
console.info(remapped);
remap
函数做什么? - Sefe