Record<keyof T, T[keyof T]>
是 TypeScript 中的一个高级类型构造,它用于构建一个新的对象类型,其中的键是类型 T
的所有键的联合类型,值则是这些键对应的值类型。
让我们逐步解析这个表达式:
-
keyof T
:keyof
是一个类型运算符,它接受一个类型T
并返回该类型的键(属性名)的联合类型。- 例如,如果你有一个类型
T
如下:
那么type T = { name: string; age: number; };
keyof T
就是"name" | "age"
。
-
T[keyof T]
:T[keyof T]
表示从类型T
中选择一个键(由keyof T
定义),然后获取该键对应的值类型。- 例如,在上面的例子中,
T[keyof T]
可以是string
或number
,因为T
的键"name"
对应的值类型是string
,而"age"
对应的是number
。
-
Record<keyof T, T[keyof T]>
:Record<K, V>
是一个实用工具类型,它接受两个类型参数:键类型K
和值类型V
。- 它创建一个新的对象类型,其中键是
K
类型,值是V
类型。 - 在我们的例子中,
Record<keyof T, T[keyof T]>
创建一个新的对象类型,其键是T
的所有键的联合类型,值是这些键对应的值类型。
示例代码:
type User = {
name: string;
age: number;
class: string;
};
type UserKeys = keyof User; // "name" | "age" | "class"
type UserValues = User[keyof User]; // string | number | string
type UserRecord = Record<keyof User, User[keyof User]>;
const user: UserRecord = {
name: "Alice",
age: 25,
class: "A1"
};
在这个例子中,UserRecord
类型等价于 User
类型,因为它包含了相同的键和值类型。但是,Record<keyof User, User[keyof User]>
的主要用途在于它可以动态地根据 T
的键和值来构建类型,而不是硬编码键和值类型。