You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为替换对象键的函数返回值定义TypeScript类型

修正TypeScript replace函数的返回类型

问题核心

当前replace函数的返回类型不符合需求:我们需要返回的对象类型既要包含原对象O中排除R所有键后的全部键值类型,同时也要包含R中用来替换的键及其对应值的类型,但现有返回类型Omit<O, keyof R>只做到了前者,漏掉了后者。

现有代码

type JSObject = {
  [key: string | number | symbol]: unknown
}

export function replace<O extends JSObject, R extends { [K in keyof O]?: string }>(
  object: O,
  replacement: R
): Omit<O, keyof R> {
  const regex = new RegExp(`(${Object.keys(replacement).join('|')})`, 'g')
  const stringify = JSON.stringify(object).replace(regex, (match) => replacement[match] ?? match)
  return JSON.parse(stringify)
}

修正方案

调整返回类型为Omit<O, keyof R> & R,同时补充必要的类型断言避免语法报错:

type JSObject = {
  [key: string | number | symbol]: unknown
}

export function replace<O extends JSObject, R extends { [K in keyof O]?: string }>(
  object: O,
  replacement: R
): Omit<O, keyof R> & R {
  const regex = new RegExp(`(${Object.keys(replacement).join('|')})`, 'g')
  // 断言match为R的键类型,避免类型不匹配
  const stringify = JSON.stringify(object).replace(regex, (match) => replacement[match as keyof R] ?? match)
  // 断言解析结果为目标类型
  return JSON.parse(stringify) as Omit<O, keyof R> & R
}

类型说明

  • Omit<O, keyof R>:移除原对象O中所有在R里存在的键,保留剩余键的原有类型
  • & R:将R的键值类型合并进去,这样最终返回类型就同时包含了原对象剩余键和替换后的键
  • 两处类型断言:因为JSON序列化/解析过程会丢失类型信息,且match是字符串类型,需要手动对齐TypeScript的类型检查

内容的提问来源于stack exchange,提问作者Filipe Boechat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:47:12