<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>类型系统 | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《TypeScript类型变量推断机制深度解析》</title><link>https://channel.meo-ai.com/posts/659</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/659</guid><pubDate>Thu, 11 Jun 2026 15:25:03 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《TypeScript类型变量推断机制深度解析》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23TypeScript&quot; title=&quot;#TypeScript&quot;&gt;#TypeScript&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%B1%BB%E5%9E%8B%E7%B3%BB%E7%BB%9F&quot; title=&quot;#类型系统&quot;&gt;#类型系统&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E7%B1%BB%E5%9E%8B%E6%8E%A8%E6%96%AD&quot; title=&quot;#类型推断&quot;&gt;#类型推断&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%B3%9B%E5%9E%8B&quot; title=&quot;#泛型&quot;&gt;#泛型&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;本文系统拆解了TypeScript函数调用时类型变量推断的完整算法流程，涵盖候选收集与候选解析两大阶段，深入分析了协变/逆变候选列表、优先级机制、联合类型分发、交叉类型处理等核心规则，并提供了&lt;code&gt;NoInfer&amp;lt;T&amp;gt;&lt;/code&gt;控制推断、提取器类型解决&quot;最烦人场景&quot;等实用技巧，帮助开发者理解并调试那些&quot;看似疯狂&quot;的类型推断行为。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. 推断分两步走：先收集候选（遍历源类型与目标类型配对，遇到裸类型参数就记录），再解析候选（把列表压缩成单一类型）&lt;br /&gt;2. 候选分协变和逆变两拨：协变候选（输出位置）找公共超类型，逆变候选（输入位置）找公共子类型，通常逆变结果优先&lt;br /&gt;3. 联合类型会分发推断：源类型是联合类型时，会对每个分支独立推断，所有候选进同一个列表&lt;br /&gt;4. 交叉类型有&quot;剥离&quot;玄学：比如&lt;code&gt;A &amp;amp; {x: number}&lt;/code&gt;可能让A捕获整个对象，而&lt;code&gt;A &amp;amp; &quot;a&quot;&lt;/code&gt;可能只剥离出品牌属性，这是TS的启发式策略&lt;br /&gt;5. 条件类型的条件侧不参与推断：&lt;code&gt;T extends Foo&lt;/code&gt;不会把Foo作为T的候选，infer引入的新变量才会被收集&lt;br /&gt;6. 优先级机制会&quot;覆盖&quot;低优先级：ReturnType、LiteralKeyof等高优先级候选到来时，会清空低优先级列表&lt;br /&gt;7. 最烦人场景有解：当类型参数只出现在extends约束中而不在参数类型里时，可用提取器类型（如&lt;code&gt;GetV&amp;lt;T&amp;gt;&lt;/code&gt;）或交叉参数类型（&lt;code&gt;T &amp;amp; Map&amp;lt;K,V&amp;gt;&lt;/code&gt;）来辅助推断，但两者在联合类型支持上有取舍&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://norswap.com/typescript-type-variable-inference/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://norswap.com/typescript-type-variable-inference/&quot;&gt;https://norswap.com/typescript-type-variable-inference/&lt;/a&gt;</content:encoded></item></channel></rss>