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

TypeScript泛型如何将对象中number类型属性替换为string类型

问题原因

你最初的代码混淆了「键的类型」和「键对应的值的类型」:

  • [key in keyof T] 中key的类型是对象的键名的类型,比如你示例中入参对象的键是a和b,key的类型就是"a" | "b",都是字符串字面量类型,key extends number的判断永远不成立,因此所有属性都会保留原始类型,a的类型还是number,赋值字符串就会抛出类型错误。
  • 你后续调整的写法虽然不会报错,但逻辑也不符合需求:只要第二个泛型参数传入number,所有属性都会被替换为string,你示例里b原本是boolean类型,赋值'ok'也不会触发错误,完全不符合「只替换值为number的属性」的要求。
正确实现

直接对每个键对应的值的类型做判断即可:

export type ChangeNumberFieldsToString<T extends object> = {
  [Key in keyof T]: T[Key] extends number ? string : T[Key]
}

// 测试效果符合预期
const c: ChangeNumberFieldsToString<{ a: number, b: boolean }> = {
    a: 'ok',
    b: false,
}

如果需要更灵活的通用替换方案,可以扩展为支持任意新旧类型的泛型:

export type ChangeFieldType<T extends object, OldType, NewType> = {
  [Key in keyof T]: T[Key] extends OldType ? NewType : T[Key]
}

// 替换number为string的用法
const c: ChangeFieldType<{ a: number, b: boolean }, number, string> = {
  a: 'ok',
  b: false
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:45:02