43. 替换联合类型中的键

中等0

实现一个通用工具类型 ReplaceKeys<U, T, Y> ,用于替换联合类型中的键,如果某个类型没有这个键,则跳过替换。

该工具类型接受三个参数,如果无法匹配到 Y 则类型置为 never

例如:

type NodeA = {
  type: "A"
  name: string
  flag: number
}

type NodeB = {
  type: "B"
  id: number
  flag: number
}

type NodeC = {
  type: "C"
  name: string
  flag: number
}

type Nodes = NodeA | NodeB | NodeC

/**
 * would replace `name` from string to number, replace `flag` from number to string.
 * expected to be:
 * {
 *   type: 'A',
 *   name: number,
 *   flag: string
 * } |
 * {
 *   type: 'B',
 *   id: number,
 *   flag: string
 * } |
 * {
 *   type: 'C',
 *   name: number,
 *   flag: string
 * }
 */
type ReplacedNodes = ReplaceKeys<
  Nodes,
  "name" | "flag",
  { name: number; flag: string }
>

/**
 * would replace `name` to never.
 * expected to be:
 * {
 *   type: 'A',
 *   name: never,
 *   flag: number
 * } |
 * NodeB |
 * {
 *   type: 'C',
 *   name: never,
 *   flag: number
 * }
 */
type ReplacedNotExistKeys = ReplaceKeys<
  Nodes, 
  "name",
  { aa: number }
>
评论(0)
题库

TypeScript

加载中...