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

如何让TypeScript函数返回值类型为枚举键的小写联合类型?

解决方案

要实现这个需求,你可以借助TypeScript的字符串字面量类型编程和泛型自动推导返回值类型,无需手动枚举小写联合类型,具体实现如下:

1. 定义首字母小写的类型工具

先写一个类型工具,用来将字符串字面量的首字母转为小写:

type LowerFirst<T extends string> = T extends `${infer First}${infer Rest}` 
  ? `${Lowercase<First>}${Rest}` 
  : never;

这个类型通过模板字符串拆分出首字母和剩余部分,用Lowercase工具类型处理首字母后重新拼接,实现首字母小写的类型转换。

2. 修改foo为泛型函数

给foo添加泛型约束,让参数类型绑定到枚举的键,同时指定返回值为处理后的小写字面量类型:

enum Fruit {
  'Apple',
  'Banana',
  'Peach'
}

type LowerFirst<T extends string> = T extends `${infer First}${infer Rest}` 
  ? `${Lowercase<First>}${Rest}` 
  : never;

function foo<T extends keyof typeof Fruit>(str: T): LowerFirst<T> {
  return str.replace(/^[A-Z]/, d => d.toLocaleLowerCase()) as LowerFirst<T>;
}

const res = foo('Apple'); // res 类型为 'apple'
const res2 = foo('Banana'); // res2 类型为 'banana'
const res3 = foo('Peach'); // res3 类型为 'peach'

关键说明:

  • 泛型T约束为keyof typeof Fruit,确保传入参数只能是枚举的合法键('Apple'|'Banana'|'Peach')
  • 返回类型LowerFirst<T>会根据传入的具体T自动推导对应的首字母小写字面量
  • 由于TypeScript无法自动识别replace方法的返回值为具体字面量类型,所以用as LowerFirst<T>做类型断言,让类型系统和代码逻辑对齐

这样就达成了需求:调用foo传入不同枚举键时,返回值类型自动对应为小写字面量,无需手动定义'apple' | 'banana' | 'peach'联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:00:54