yunliuyan / type-challenges

typescript-challenges
0 stars 2 forks source link

00018-medium-merge #18

Open yunliuyan opened 1 year ago

yunliuyan commented 1 year ago

Merge 中等 #object

by ZYSzys @ZYSzys

接受挑战    English 日本語 한국어

将两个类型合并成一个类型,第二个类型的键会覆盖第一个类型的键。

例如

type foo = {
  name: string;
  age: string;
}

type coo = {
  age: number;
  sex: string
}

type Result = Merge<foo,coo>; // expected to be {name: string, age: number, sex: string}

返回首页 分享你的解答 查看解答
yunliuyan commented 1 year ago

思路

key 遍历为foo,coo的合集

代码实现

type Merge<T, U> = {
  [key in keyof T | keyof U]: key extends keyof U ? U[key] : key extends keyof T ? T[key] : never;
} 

type Result = Merge<foo,coo>; // expected to be {name: string, age: number, sex: string}
Janice-Fan commented 1 year ago
type Merge<T extends Object, P extends Object> =  {
    [k in keyof T | keyof P]: k extends keyof P ? P[k] : k extends keyof T ? T[k] : never;
}

type foo = {
    name: string;
    age: string;
}

type coo = {
    age: number;
    sex: string
}

type Result = Merge<foo,coo>; // expected to be {name: string, age: number, sex: string}
liangchengv commented 1 year ago
type Merge<T, U> = {
  [K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
};

type foo = {
  name: string;
  age: string;
}

type coo = {
  age: number;
  sex: string
}

type Result = Merge<foo,coo>; 
wudu8 commented 1 year ago
type MyMerge<T, U> = {
  [key in keyof T | keyof U]: key extends keyof U ? U[key] : key extends keyof T ? T[key] : never;
} 

type foo = {
  name: string;
  age: string;
}

type coo = {
  age: number;
  sex: string
}

type mergeResult = MyMerge<foo,coo>; // expected to be {name: string, age: number, sex: string}