如何为替换对象键的函数返回值定义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
相关产品推荐
相关产品推荐

