ts中的Record
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
的话,确实是有点头疼。
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1564
最后一传例子,运行ts报错
Element implicitly has an ‘any’ type because expression of type ‘string’ can’t be used to index type ‘Record’.
No index signature with a parameter of type ‘string’ was found on type ‘Record’.ts(7053)