qq_58167463 2022-12-06 09:00 采纳率: 100%
浏览 19
已结题

TypeScript 合并两个对象类型

1.TS 不一样的类型怎么合并?

   // 合并两个对象类型
type MergeObject<T extends Record<string, string>, U extends Record<string, string>> = {

}

type MergeObject<{a: string}, {b: number}>;    // =>  {a: string, b: number}

2.

题目:
type formateParams<T>(arg: T) {}

type F= formateParams("a=1&b=2&c=3");    //=> {a:1,b:2, c:3}
答:
type _Split<
  T extends string,
  I extends string
> = T extends `${infer H}${I}${infer Rest}` ? [H, ..._Split<Rest, I>] : [T];

type _Map<T extends string[], U extends any[] = []> = T extends [
  infer H,
  ...infer Rest extends string[]
]
  ? H extends `${infer K}=${infer V}`
    ? _Map<Rest, [...U, { [key in K]: V }]>
    : never
  : U;

type MergeObject<
  T extends Record<string, string>,
  U extends Record<string, string>
> = {
  [K in keyof T | keyof U]: K extends keyof T
    ? K extends keyof U
      ? [T[K], U[K]]
      : T[K]
    : U[K & string];
};

type MergeObjectArray<
  T extends Record<string, string>[],
  U extends {} = {}
> = T extends [
  infer H extends Record<string, string>,
  ...infer Rest extends Record<string, string>[]
]
  ? MergeObjectArray<Rest, MergeObject<U, H>>
  : U;

type FormateParams<T extends string> = MergeObjectArray<_Map<_Split<T, "&">>>;

function _formateParams<T extends string>(querystring: T): FormateParams<T> {
  return querystring
    .split("&")
    .map((item) => item.split("="))
    .reduce((prev, [key, value]) => {
      prev[key] = value;
      return prev;
    }, {} as Record<string, string>) as any;
}

const res = _formateParams("a=1&b=2&c=3&a=5&b=6");

展开全部

  • 写回答

2条回答 默认 最新

  • qq_58167463 2022-12-06 10:37
    关注
    // 合并两个对象类型
    type MergeObject<
      T extends Record<string, any>,
      U extends Record<string, any>
    > = {
      [K in keyof T | keyof U]: K extends keyof T
        ? K extends keyof U
          ? [T[K], U[K]]
          : T[K]
        : U[K & string];
    };
    
    type X = MergeObject<{ a: string }, { b: number }>; 
    // {a: string, b: number}
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月7日
  • 修改了问题 12月7日
  • 创建了问题 12月6日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部