在Typescript中,Record<K extends keyof any, T>是什么意思?

4
我发现了这段代码 -
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

在这里,我理解 T> 是一种通用的类型断言。

有人能解释一下 K 是什么吗? 还请解释一下这个函数返回的内容和示例输入/输出?

感谢您的期待。


这实际上是一个键值存储的类型定义。K扩展了任何键的类型只是一种通用类型约束。但是,我不知道K中的P代表键类型的什么意思。 - bturner1273
感谢bturner1273和@yqlim。这部分回答了我的问题。 - Jananie Balaji
keyof any 的子集是 any,即键只能是字符串、数字或符号。因此,类型 keyof anystring | number | symbol - aderchox
1个回答

3
首先,keyof 返回一个类型的所有键的并集。
type BadVector = { x: string, y: boolean }
keyof BadVector // "x" | "y"

所以,K extends keyof any 表示 K 是一个联合类型的键。例如,类型 keyof BadVector 将扩展为 keyof any

其次,映射类型(mapped type) 可将对象的所有键映射到一个新值类型。因此,[P in K]: T 的意思是:将 K 中的每个属性 P 映射到值类型 T

例如,看看文档中的示例

interface CatInfo {
  age: number;
  breed: string;
}
 
type CatName = "miffy" | "boris" | "mordred";
 
const cats: Record<CatName, CatInfo> = {
  miffy: { age: 10, breed: "Persian" },
  boris: { age: 5, breed: "Maine Coon" },
  mordred: { age: 16, breed: "British Shorthair" },
};

cats 的类型是 Record<CatName, CatInfo>。这意味着对于 CatName 中的所有类型,都必须提供一个类型为 CatInfo 的值。


感谢 @linkuskmr 的详细解释 :) - Jananie Balaji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接