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

如何定义可准确获取字符串类型首字母的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:24:03