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

TypeScript类型推断疑问:单独推断Record值类型为何返回never?

TypeScript 4.9.4中Record类型推断的异常行为解析

以下是复现问题的代码:

interface TestInterface {
    A: string
}

type Test = TestInterface extends Record<infer K, any> ? K : never;
let t1: Test; // 类型为"A"

type Test2 = TestInterface extends Record<any, infer V> ? 1 : never;
let t2: Test2; // 类型为never

type Test3 = TestInterface extends Record<infer K, infer V> ? V : never;
let t3: Test3; // 类型为string

观察到的现象:

  • 仅推断Record的键类型时,能正确得到键名"A";
  • 仅推断Record的值类型时,返回never;
  • 同时推断键和值类型时,能正确得到值类型string。

原因解析

这是TypeScript条件类型推断的规则特性导致的:

  1. 仅推断键类型(Record<infer K, any>):any作为值类型参数时,由于TypeScript中所有类型都兼容any,编译器会将TestInterface匹配为“键类型为K、值类型兼容any”的Record结构,因此能正常推断出K为"A"。
  2. 仅推断值类型(Record<any, infer V>):any作为键类型参数时,Record<any, V>代表“键可以是任意类型、值为V的对象”。但TestInterface的键是固定的"A",并非任意类型,编译器无法将其匹配到Record<any, V>的结构,因此条件判断不成立,返回never。
  3. 同时推断键和值类型(Record<infer K, infer V>):此时两个泛型参数都是待推断状态,编译器会按照正常的结构匹配逻辑,将TestInterface拆解为对应的键类型联合("A")和值类型联合(string),因此能正确推断出V为string。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:10:38