
在 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 删除。