在 TypeScript 中,Record
是一个内置的泛型工具类型,它的用途是创建一个具有特定键和值类型的对象映射。这段代码定义了 Record
类型的实现,并通过简单的语言特性表达了强大的功能。
以下是代码的详细含义分析:
/**
* Construct a type with a set of properties K of type T
*/
type Record<K extends keyof any, T> = {
[P in K]: T;
};
我们可以通过以下几步对其含义进行逐层拆解:
type Record<K extends keyof any, T>
Record
。K
是一个泛型参数,表示键的集合。K extends keyof any
意味着 K
必须是可以作为对象键的类型。string
、number
和 symbol
,而 keyof any
正是这三种类型的联合类型。T
是另一个泛型参数,表示值的类型。{ [P in K]: T; }
[P in K]
表示我们将遍历 K
中的每个键,创建对应的属性 P
。T
是每个属性 P
的值类型。K
中的元素,值是类型 T
。Record
的输入是两个泛型参数:K
和 T
。K
限制为所有可以作为对象键的类型。K
中的每个元素 P
,生成一个属性 P
,其类型为 T
。K
中所有键,并且值类型均为 T
的对象。下面是一个运行示例,展示了 Record
的实际应用及效果:
// 定义一个对象类型,其键是 "id" 和 "name",值类型是 string
type ExampleRecord = Record<'id' | 'name', string>;
// 使用该类型
type User = ExampleRecord;
const user: User = {
id: `123`,
name: `Alice`
};
console.log(user);
在这个示例中:
Record<'id' | 'name', string>
创建了一个类型,其键是 id
和 name
,值类型是 string
。user
必须符合这个类型,因此需要定义 id
和 name
属性,且它们的值都必须是字符串。我们可以通过更多示例展示 Record
的灵活性。
const dynamicKeys = [`key1`, `key2`, `key3`];
type DynamicRecord = Record<typeof dynamicKeys[number], number>;
const data: DynamicRecord = {
key1: 10,
key2: 20,
key3: 30
};
console.log(data);
这里,我们从一个数组 dynamicKeys
中提取键的集合,并生成了一个值为数字的对象类型。
type NestedRecord = Record<string, Record<string, number>>;
const nestedData: NestedRecord = {
category1: {
item1: 100,
item2: 200
},
category2: {
item3: 300,
item4: 400
}
};
console.log(nestedData);
在这个示例中:
Record
。Record
的键是字符串,值是数字。Record
的应用场景Record
是一种高度通用的工具类型,适用于许多场景:
Partial
、Readonly
)定义复杂对象结构。Record
提供了更简洁的方式。type ReadonlyRecord = Readonly<Record<'x' | 'y', number>>;
const point: ReadonlyRecord = {
x: 10,
y: 20
};
// point.x = 30; // Error: Cannot assign to 'x' because it is a read-only property.
通过结合 Readonly
,可以生成只读映射类型。
type ConditionalRecord<K extends keyof any, T> = {
[P in K]: P extends string ? T : never;
};
const conditional: ConditionalRecord<'a' | 1, string> = {
a: `hello`,
1: `world`
};
console.log(conditional);
在这个示例中,我们引入了条件类型,为某些键赋予特殊规则。
TypeScript 中的 Record
是一种灵活而强大的工具类型。通过它,我们可以快速定义具有特定键值映射关系的对象类型。其实现逻辑依赖于映射类型和泛型,是 TypeScript 类型系统的重要基础之一。通过结合其他类型工具和高级特性,Record
能进一步扩展其功能,适应各种复杂的场景。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。