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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:31:32