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

TypeScript中如何实现枚举/字符串字面量的类型转换?

TypeScript字符串字面量首字母大写并保留类型信息

要实现输入字符串字面量时返回对应首字母大写的字面量类型,你可以利用TypeScript的模板字面量类型和泛型约束来实现,具体方案如下:

实现代码

方案1:使用内置工具类型

TypeScript内置了Capitalize工具类型,可以直接用来处理字符串首字母大写的类型转换:

function capitalize<T extends string>(str: T): Capitalize<T> {
  // 类型断言告诉编译器运行时结果符合预期类型
  return (str.charAt(0).toUpperCase() + str.slice(1)) as Capitalize<T>;
}

const myName = 'ryuma' as const;
const result = capitalize(myName); // 类型为 "Ryuma",而非宽泛的 string

方案2:自定义类型转换逻辑

如果你想手动实现首字母大写的类型转换逻辑,可以通过条件类型结合infer关键字拆分字符串:

// 自定义首字母大写类型
type CapitalizeLiteral<T extends string> = T extends `${infer First}${infer Rest}`
  ? `${Uppercase<First>}${Rest}`
  : T;

function capitalize<T extends string>(str: T): CapitalizeLiteral<T> {
  return (str.charAt(0).toUpperCase() + str.slice(1)) as CapitalizeLiteral<T>;
}

const myName = 'ryuma' as const;
const result = capitalize(myName); // 类型为 "Ryuma"

核心说明

  1. 保留字面量类型:通过将泛型T约束为string,当传入'ryuma' as const时,TypeScript会自动将T推断为字面量类型"ryuma",而非宽泛的string。
  2. 类型转换匹配:无论是内置的Capitalize<T>还是自定义的CapitalizeLiteral<T>,都会将输入的字面量类型转换为首字母大写的版本,确保返回类型与运行时结果一致。
  3. 类型断言的必要性:由于TypeScript无法自动将运行时的字符串拼接结果与字面量类型关联,这里的类型断言是安全的——运行时逻辑确实会执行首字母大写操作,与类型转换的语义完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11