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条件类型推断的规则特性导致的:
- 仅推断键类型(
Record<infer K, any>):any作为值类型参数时,由于TypeScript中所有类型都兼容any,编译器会将TestInterface匹配为“键类型为K、值类型兼容any”的Record结构,因此能正常推断出K为"A"。 - 仅推断值类型(
Record<any, infer V>):any作为键类型参数时,Record<any, V>代表“键可以是任意类型、值为V的对象”。但TestInterface的键是固定的"A",并非任意类型,编译器无法将其匹配到Record<any, V>的结构,因此条件判断不成立,返回never。 - 同时推断键和值类型(
Record<infer K, infer V>):此时两个泛型参数都是待推断状态,编译器会按照正常的结构匹配逻辑,将TestInterface拆解为对应的键类型联合("A")和值类型联合(string),因此能正确推断出V为string。
内容的提问来源于stack exchange,提问作者Evgeny Naumov
相关产品推荐
相关产品推荐

