ts官网上关于Record
的介绍是少之又少,所谓的高级类型,Record
到底是用来干嘛的呢?
顾名思义,Record
用来拷贝属性,官网上有这么一句话:Record
并不需要输入类型来拷贝属性。是什么意思呢,看的是一知半解。
type person = {
prop1: string;
prop2: string
prop3: string
};
type someProps = Record<12 | keyof person, string>;
let newPerson: someProps = {
prop1: "111",
prop2: "222",
prop3: "444",
12: "asdad",
};
可以看到,someProps
类型拷贝了person
所有的键也同时拷贝了一个数字12
为其键,这样算是同时拷贝了这两种不同的属性到新的类型中,当然你还可以写更多。那么,我觉得应该就是这个意思吧,你不需要输入数据类型来拷贝这些属性。
可以在看一个更复杂的用法
function mapObject<K extends string | number, T, U>(
obj: Record<K, T>,
f: (x: T) => U
): Record<K, U> {
let ret = <Record<K, U>>{};
Object.keys(obj).map(key => {
ret[key] = f(obj[key]);
});
return ret;
}
这段代码通过Record
将属性K
对应的T
类型转换为U
类型。
const objs = { prop1: "are", prop2: "you", prop3: "ok" };
const lengths = mapObject(objs, str => str.length);
那么上述测试用例则输出的为{ prop1: 3, prop2: 3, prop3: 2 }
。可以看到,对应的值类型发生了预期的变化,通过Record
可以很轻松地完成类型的转换,如果不用Record
的话,确实是有点头疼。
如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!
如无特殊声明,文章均为原创,若有不正之处,万望告知。转载请附上原文地址,十分感谢!