type-challenges:Merge

58 阅读1分钟

Merge

问题描述

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

例如

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}
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'type Foo = {
  a: number
  b: string
}
type Bar = {
  b: number
  c: boolean
}
​
type cases = [
  Expect<Equal<Merge<Foo, Bar>, {
    a: number
    b: number
    c: boolean
  }>>,
]
​
​
// ============= Your Code Here =============// 错误答案
// type Merge<F extends {}, S extends {}> ={
//   [K in keyof (F | S)]:K extends keyof S ?S[K]:K extends keyof F ?F[K]:never
// }// 答案
type Merge<F extends {}, S extends {}> ={
  [K in keyof F | keyof S]:K extends keyof S ?S[K]:K extends keyof F ?F[K]:never
}
​
type Union=keyof (Foo| Bar) // b
​
​

这里原本已经很接近正确答案了,一直想不通为什么不对,原来是 keyof (F | S)keyof F | keyof S 并不相同,一个是先取联合类型,联合类型中 ac 是可选属性,只有 b 是必选属性,所以 keyof (F | S) 的值是 b, 而 keyof F | keyof S 的值是 a|b|c ,这点需要注意,其次,可以发现,后面的对象中的属性类型覆盖前一个对象中的属性。所以判断时,首先取后面对象中的属性的类型。