我希望能够使用映射函数动态重命名键。为此,我已经编写了以下代码:
interface DateRange {
startDate: string;
endDate: string;
}
function format<K extends string>(range: DateRange, mapping: {[X in keyof DateRange]: K}): {[P in K]: string} {
return {
[mapping.startDate]: range.startDate,
[mapping.endDate]: range.endDate,
};
}
当我使用
as {[P in K]: string}
来强制转换此函数的返回值时,一切都正常工作,但是如果没有这个强制转换,它就无法编译。错误信息:
TS2322: Type '{ [x: string]: string; }' is not assignable to type '{ [P in K]: string; }'.
从我看到的情况来看,DateRange
接口的两个键都被使用,因此返回值的键都应该是K
类型。
如果不需要进行强制转换,函数应该是什么样子的?
调用示例:
const formatted = format(
{startDate: 'startDateValue', endDate: 'endDateValue'},
{startDate: 'start', endDate: 'end'}
);
// formatted = {end: 'endDateValue', start: 'startDateValue'}