Record
TypeScript内置的工具类型 Record
// type Record<K extends string | number | symbol, T> = { [P in K]: T; }
interface Developer extends Record<string, any> {
name: string;
age?: number;
}
let developer: Developer = { name: "semlinker" };
developer.age = 30;
developer.city = "XiaMen";
TS源码是怎么定义Record的
type Record<K extends keyof any, T> = { [P in K]: T; };
type res = keyof any;
需要约束某个类型参数为索引 Key 时,用 keyof any 动态获取比写死 string | number | symbol 更好
object 和 Record<string, any>
TypeScript 里有三个类型比较难区分,就是 object、Object、{} 这几个。
其实只要记住 object 不能接受原始类型 就可以了,其余两个差不多,只不过 {} 是个空对象,没有索引。
所以 number 就可以赋值给 {}、Object 类型,但是不能赋值给 object 类型:
type res = number extends object ? true : false;
**type res= false**
type res = number extends {} ? true : false;
**type res= true**
type res = number extends Object ? true : false;
**type res= true**
我们发现大家都不用 object 来约束,而是用 Record<string, any> 来约束索引类型,这俩其实是一样的,但是 Record<string, any> 更语义化一些。
Record<string, any> 创建了一个 key 为任意 string,value 为任意类型的索引类型:
type res = Record<string, any>
**
type res = {
[x: string]: any;
}
**
平时约束索引类型的时候就可以用 Record<string, any> 代替 object。
最后更新于
这有帮助吗?