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
相关产品推荐
相关产品推荐

