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

TypeScript中Record<A,B>与{[key:A]:B}类型的区别是什么

TypeScript中索引签名与Record工具类型的差异分析

在你给出的示例代码中,type A(索引签名形式)和type B(Record工具类型)在多数简单场景下表现一致,但存在两个关键差异:

1. 额外已知属性的兼容性差异

索引签名{[key: string]: T}允许对象包含额外的、明确声明的已知属性,只要属性值符合T的类型约束;而Record<string, T>会严格校验所有属性,不允许存在显式声明的额外已知属性(除非使用类型断言绕过检查)。

示例代码:

// 符合索引签名类型A的约束,可通过检查
const objA: A = { name: "Alice", age: 25, isValid: true, extra: "test" };

// 不符合Record类型B的约束,会触发类型错误
const objB: B = { name: "Alice", age: 25, isValid: true, extra: "test" };

2. 对联合类型键的支持差异

Record<K, T>可以直接接收联合类型作为键类型K,自动将联合类型的每个成员标记为合法键;而索引签名的键类型只能是string、number、symbol这三种基础类型(或它们的子集),无法直接使用联合类型作为索引签名的键。

示例代码:

type Keys = "name" | "age";

// 合法:Record支持联合类型作为键
type RecordType = Record<Keys, string>;

// 语法错误:索引签名不允许使用联合类型作为键类型
type IndexType = {[key: Keys]: string};

内容的提问来源于stack exchange,提问作者Sebastian Barth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:09