在用ts写一个重命名key的方法,一直没思绪,在stackoverflow上搜索到类型定义如下:
interface User {
_id : string;
name : string;
email : string;
password: string;
phone : number;
}
type UnionToIntersection<U> =
(U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type PickRenameMulti<T, K extends keyof T, R extends { [P in K]: string }> =
Omit<T, K> & UnionToIntersection<{ [P in K]: { [PP in R[P]]: T[P] } }[K]>
type PickRenameMultiV2<T, R extends Record<string, string>> =
R extends Record<infer K, string> ? ([K] extends [keyof T] ?
PickRenameMulti<T, K, R> : never) : never
type Renamed = PickRenameMultiV2<User, { _id: "id", name: "lala" }>
但是具体到实际方法实现的时候又卡壳了,不知道该怎么写类型,有TS大神能帮忙解答下吗
function rename(keyMap, data) {
return Object.keys(data).reduce((res, k) => {
if(k in keyMap) res[ keyMap[k] ] = data[k];
else res[k] = data[k];
return res;
}, {});
}