ts中的Record

该文章由 leevare 发布于 ,归类于 Javascript

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的话,确实是有点头疼。

如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!

相关文章:

说点什么

avatar
300
  Subscribe  
提醒