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

TypeScript中能否一次性提取模板字符串的前缀与联合类型后缀?

TypeScript模板字符串:联合类型后缀的一次性提取

在TypeScript里用模板字符串类型提取单个字符前缀和剩余内容时,写法很简洁:

type str = "abcd"
// 一次性获取"a"和"bcd"
type ret = str extends `${infer first}${infer rest}` ? `${first}${rest}` : str;

但如果要匹配的后缀是联合类型(比如"a" | "b" | "c"),常规写法得嵌套两次extends,步骤很冗余。那能不能一次性提取出目标前缀和匹配到的后缀?

当然可以,直接在同一次extends判断里,给推断的后缀加上联合类型约束就行,写法如下:

type str2 = "123c"
type t2 = "a" | "b" | "c"

// 一次性提取前缀和符合联合类型的后缀
type ExtractPrefixAndSuffix<S extends string, T extends string> = 
  S extends `${infer Before}${infer After extends T}` ? { prefix: Before, suffix: After } : never;

type ret2 = ExtractPrefixAndSuffix<str2, t2>;
// ret2 类型为 { prefix: "123", suffix: "c" }

原理很简单:通过infer After extends T的语法,在推断后缀时直接限定它必须属于联合类型T,这样一次判断就能同时拿到前缀Before和符合要求的后缀After,不用再嵌套二次匹配。

如果不需要包装成对象,也可以返回元组或者自定义格式:

type ExtractPrefixAndSuffixTuple<S extends string, T extends string> = 
  S extends `${infer Before}${infer After extends T}` ? [Before, After] : never;

type ret3 = ExtractPrefixAndSuffixTuple<str2, t2>;
// ret3 类型为 ["123", "c"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:26:20