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

