TypeScript模板字符串类型匹配:为何_R1为空字符串?
TypeScript字符串模板类型匹配问题解答
问题
以下TypeScript代码中:
type Foo<Str extends string, Search extends string> = Str extends `${infer _R1}${Search}${infer _R2}` ? `${_R1}` : false type Res1 = Foo<'linbudu', 'lin'> // ""请问为何_R1的结果是空字符串而非"l"?以及如何理解infer中间的${Search}的匹配逻辑?
为什么_R1是空字符串?
模板类型的匹配要求拆分后的三部分拼接起来必须完全等于原字符串。对于Str='linbudu'和Search='lin',只有当_R1为空字符串时,_R1 + Search + _R2才能拼接出原字符串:'' + 'lin' + 'budu' = 'linbudu'。
如果假设_R1是"l",拼接后会得到'l' + 'lin' + _R2 = 'llin' + _R2,这和原字符串开头的'lin'完全不符,根本无法匹配,所以这个分支不会被TypeScript选中。
如何理解${Search}的匹配逻辑?
${Search}是精确匹配完整的Search字面量:它会在原字符串Str中寻找一段连续的、与Search完全一致的子串,找到后将Str拆分为三段:子串之前的内容(_R1)、子串本身(Search)、子串之后的内容(_R2)。- 匹配遵循最左侧优先原则:如果Str中存在多个符合条件的子串,TypeScript会优先匹配最左边的那个。比如
Foo<'linlinbudu', 'lin'>的_R1依然是空字符串,因为第一个匹配的是开头的'lin'。 - 只有当Str中确实包含Search作为子串时,整个条件才会成立,否则返回
false。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

