如何定义可准确获取字符串类型首字母的TypeScript类型及泛型函数
TS字符串首字母类型推导稳定实现方案
你当前用到的${infer FirstLetter}${string}推导逻辑是TypeScript 4.1版本正式发布模板字符串类型时就明确的官方规则,不属于非预期的版本特性,后续版本不会随意修改,本身稳定性就有保障。
如果想要进一步加双重校验,避免极端场景下的类型偏差,可以给推导的首字符增加显式的单长度约束,实现方案如下:
1. 通用首字符类型工具实现
// 兼容TS4.1及以上版本,显式校验首字符长度为1 type FirstLetter<T extends string> = T extends `${infer F}${string}` ? F extends string & { length: 1 } ? F : never : never; // TS4.7及以上版本可以用更简洁的infer约束写法 // type FirstLetter<T extends string> = // T extends `${infer F extends string & { length: 1 }}${string}` // ? F // : never;
2. 联合类型使用示例
type Speed = 'fast' | 'slow' | 'medium'; // 推导结果为 'f' | 's' | 'm',和原有实现结果完全一致 type SpeedShort = FirstLetter<Speed>;
3. 对应函数实现(类型+运行时完全对齐)
function firstLetter<T extends string>(str: T): FirstLetter<T> { // 运行时逻辑和类型推导结果严格对应,避免类型欺诈 return str[0] as FirstLetter<T>; } // 测试效果 const res1 = firstLetter('fast'); // 类型:'f',运行时值:'f' const res2 = firstLetter('slow'); // 类型:'s',运行时值:'s'
空字符串兼容方案(可选)
如果需要处理入参为空字符串的场景,调整类型兜底逻辑即可:
type FirstLetter<T extends string> = T extends '' ? undefined : T extends `${infer F extends string & { length: 1 }}${string}` ? F : never; const emptyRes = firstLetter(''); // 类型:undefined,运行时值:undefined
内容的提问来源于stack exchange,提问作者Brook Jordan
相关产品推荐
相关产品推荐

