TypeScript条件类型中infer U的推断规则及匹配逻辑咨询
TypeScript中
infer U在模板字面量的类型推断机制 示例中的推断逻辑
先看你给出的代码:
type ExtractPrefix<T> = T extends `${infer U}abc` ? U : never; const mystring = "helloabc" type Result = ExtractPrefix<typeof mystring>; // Result is 'hello'
这里TypeScript会把typeof mystring(也就是字符串字面量"helloabc")和模板模式${infer U}abc做匹配:
- 它会先识别模式里的固定后缀
abc,然后检查输入字符串的末尾是否完全匹配这个后缀——"helloabc"的最后三个字符正好是abc。 - 确认匹配后,TypeScript会把后缀之前的所有内容(也就是
"hello")赋值给被infer声明的类型变量U,所以Result最终是'hello'。
如果把模式改成${infer U}c,输入还是"helloabc":
- 模式的固定后缀变成了单个字符
c,输入字符串的最后一个字符正好是c。 - 此时
c之前的所有内容("helloab")都会被赋值给U,所以结果会变成'helloab'。
infer U在模板字面量中的工作机制
infer是TypeScript条件类型里的核心关键字,用来在类型匹配过程中捕获并提取特定部分的类型信息,在模板字面量场景下的规则很明确:
- 贪婪匹配+后缀锚定:当
infer U出现在模板的前缀位置(即${infer U}固定后缀)时,TypeScript会优先锚定模式里的固定后缀部分,确认它存在于输入字符串的末尾,然后把后缀之前的所有内容全部分配给U——它会尽可能多地捕获字符,只要能保证后缀和字符串末尾完全匹配。 - 匹配失败的情况:如果输入字符串的末尾无法匹配模式里的固定后缀(比如输入是
"helloworld",模式是${infer U}abc),条件类型会进入never分支,U不会被成功推断。
内容的提问来源于stack exchange,提问作者Pedro Sturmer
相关产品推荐
相关产品推荐

