[TypeScript] Type Challenges #599 - Merge

80 阅读1分钟

题目描述

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

例如

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}

题解

/*
 * @Author: CN\ex_huangsx20 ex_huangsx20@partner.midea.com
 * @Date: 2025-01-06 17:19:01
 * @LastEditors: CN\ex_huangsx20 ex_huangsx20@partner.midea.com
 * @LastEditTime: 2025-01-06 17:22:53
 * @FilePath: c:\Users\ex_huangsx20\.typeChallenges\00599-medium-merge.ts
 * @Description: Modify here please
 */
// ============= 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<L, R> = {
  [P in keyof L | keyof R]: 
      P extends keyof R 
          ? R[P] 
          : P extends keyof L 
              ? L[P] 
              : never
}

遍历联合类型

  • [P in keyof L | keyof R]:遍历LR的所有键的联合类型

条件类型

  • P extends keyof R ? R[P] : P extends keyof L ? L[P] : never

    • 如果PR的键,则使用R[P]的值

    • 如果PL的键,则使用L[P]的值

    • 否则返回never