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

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

1条评论

  1. 最后一传例子,运行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)

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注