TypeScript泛型:如何对类型值执行字符串转大写操作
解决TypeScript泛型
valuesToUpperCase的类型错误 你的代码存在几个关键问题,直接导致了类型报错:
- 属性名引用错误:
GeneralType定义的属性是name和car,但你代码里写了T['firstName']和T['lastName'],完全不匹配 - 类型层面误用运行时方法:
toUpperCase()是JavaScript运行时方法,TypeScript类型系统无法直接调用,需要用内置的模板字面量工具类型Uppercase来实现字符串类型的大写转换 - 硬编码属性名缺乏通用性,更合理的方式是用映射类型遍历输入类型的所有属性
通用修正版本(推荐)
type GeneralType = { name: string; car: string; } // 泛型:将输入类型的所有字符串属性值转为大写类型 type ValuesToUpperCase<T> = { [K in keyof T]: T[K] extends string ? Uppercase<T[K]> : T[K]; } // 针对GeneralType的使用示例 type UpperCaseGeneral = ValuesToUpperCase<GeneralType>; // UpperCaseGeneral最终类型:{ name: Uppercase<string>; car: Uppercase<string>; }
关键说明
[K in keyof T]:映射类型,遍历输入类型T的所有属性键T[K] extends string ? Uppercase<T[K]> : T[K]:条件类型,仅当属性值为字符串类型时,用Uppercase转为大写字符串类型;非字符串属性保持原类型- 如果你的泛型仅需处理
GeneralType及其子类,可添加泛型约束:type ValuesToUpperCase<T extends GeneralType> = { ... }
简化修正版本(仅针对固定属性)
如果你确实只需要处理name和car两个固定属性,也可以直接修正属性名并使用Uppercase:
type GeneralType = { name: string; car: string; } type ValuesToUpperCase<T extends GeneralType> = { name: Uppercase<T['name']>, car: Uppercase<T['car']>, }
以上两种写法都能解决'toUppercase' implicitly has an 'any' return type的错误。
内容的提问来源于stack exchange,提问作者makar0v
相关产品推荐
相关产品推荐

