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

