关于typescript的骚操作的疑问

在用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;
  }, {});
}
阅读 1.8k
1 个回答
function rename<T, K extends Record<string, string>>(
  keyMap: T,
  data: K
): PickRenameMultiV2<T, K> {
  return Object.keys(data).reduce((res, k) => {
    if (k in keyMap) res[keyMap[k]] = data[k];
    else res[k] = data[k];
    return res;
  }, {} as PickRenameMultiV2<T, K>);
}

const res = rename<User, { _id: "id"; name: "lala" }>(
  {
    _id: "1",
    name: "2",
    email: "3",
    password: "4",
    phone: 1,
  },
  {
    _id: "id",
    name: "lala",
  }
);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题