【发布时间】:2018-06-15 20:43:27
【问题描述】:
我想使用映射函数动态重命名键。为此,我做了这个:
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'}
【问题讨论】:
标签: javascript typescript typescript2.0