qq_58167463 2022-12-06 17: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 18: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月15日
  • 已采纳回答 12月7日
  • 修改了问题 12月7日
  • 创建了问题 12月6日

悬赏问题

  • ¥15 husky+kinova jaco2 仿真
  • ¥15 MATLAB数据处理
  • ¥15 zigbee终端设备入网失败
  • ¥15 金融监管系统怎么对7+4机构进行监管的
  • ¥15 硬件IIC从模式的数据发送,中断数据的接收,不能用HAL库(按照时序图)
  • ¥20 QAxWidget上显示一个word文档后,如何直接在该QAxWidget上修改和保存word文档
  • ¥15 Simulink仿真报错,请问如何解决
  • ¥20 宝塔面板无法添加Node项目,一直处于正在添加脚本页面
  • ¥50 Dkeil5 CT107D单片机的程序编写
  • ¥30 Ubuntu20.04中PVN3D复现过程交叉编译问题