Skip to content

合并两个类型

约 332 字大约 1 分钟

2022-12-01

题目

Github: 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}

解题思路

首先使用 keyof 和联合类型获取两个类型的所有 key

type Merge<F, S> = {
  [K in keyof F | keyof S]: any
}

接下来,判断 K 是否在 S 中,如果在,返回 S[K]

type Merge<F, S> = {
  [K in keyof F | keyof S]: K extends keyof S ? S[K] : any
}

最后,判断 K 是否在 F 中,如果在,返回 F[K]

type Merge<F, S> = {
  [K in keyof F | keyof S]: K extends keyof S ? S[K] : K extends keyof F ? F[K] : never
}

答案

type Merge<F, S> = {
  [K in keyof F | keyof S]: K extends keyof S
    ? S[K]
    : K extends keyof F
      ? F[K]
      : never
}

验证

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
}>>, ]

参考